预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。预处理命令以符号“#”开头。

  常用的预处理指令包括:

宏定义:#define
文件包含:#include
条件编译:#if、#elif、#ifndef、#ifdef、#endif、#undef
错误信息指令:#error
#line指令
布局控制:#pragma

宏定义

  宏定义又称为宏代换、宏替换,简称“宏”。宏替换只作替换,不做计算,不做表达式求解。宏定义分带参数的宏定义和不带参数的宏定义。在带参数的宏定义,宏名和参数的括号间不能有空格。

  宏定义不分配内存,变量定义分配内存。

  宏展开不占运行时间,只占编译时间;函数调用占运行时间(分配内存、保留现场、值传递、返回值)。

  出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串,有时把这种用法的#称为字符串化运算符。例如:

#include<iostream>
using namespace std;#define STR(n)"abcd"#nint main()
{cout<<STR(6)<<endl;system("pause");return 0;
}

输出结果为:

  ##运算符用于把参数连接到一起,预处理程序把出现在##两侧的参数合并成一个符号。例如:

#include<iostream>
using namespace std;
#define STR(a,b,c) a##b##c
int main()
{cout<<STR(1,2,3)<<endl;system("pause");return 0;
}

输出结果为:

文件包含

  #include<文件名>称为标准方式,到系统头文件目录查找文件,#include"文件名"则先在当前目录(用户路径)查找,而后到系统头文件目录查找。

  我们以#include<iostream.h>和#include<iostream>为例说 明:iostream.h是C语言格式的头(库)文件,为旧版本的标准库,只支持窄字符集;而iostream为C++的标准头文件,支持窄字符集和宽字 符集。

  被包含文件中的静态全局变量不用在包含文件中声明。

条件编译

  使用条件编译可以使目标程序变小,运行时间变短。

  #undef指令,用来删除事先定义的宏定义,其一般形式为:#undef宏替换名

错误信息指令

  #error指令,该指令用于程序的调试,输出一个错误信息,当编译中遇到#error指令就停止编译。其一般形式为:#error出错信息。

#ifndef __cplusplus
#error this is not a C++ complier.
#endif
#include<iostream>
using namespace std;
int main()
{system("pause");return 0;
}

#line指令

  命令#line改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。

  其格式为:#line number [ filename ],这条指令可以改变当前的行号和文件名。

#include<iostream>
using namespace std;#line 100 "a.cpp"int main()
{cout<<__LINE__<<'\t'<<__FILE__<<endl;system("pause");return 0;
}

运行结果:

布局控制指令

  在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

  其格式一般为: #pragma Para,其中Para 为参数。

message 参数:在编译信息输出窗口中输出相应的信息

#pragma message("消息文本")

code_seg参数:设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它

#pragma code_seg(["section-name"[,"section-class"]])

#pragma once:

  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,但移植性差。如果写的程序要跨平台,最好使用C++中的宏定义。

#pragma hdrstop:表示预编译头文件到此为止,后面的头文件不进行预编译。

#pragma resource:

#pragma resource "winform.dfm"

表示把winform.dfm文件中的资源加入工程,winform.dfm中包括窗体外观的定义。

#pragma warning:输出警告信息。

我们运行一下程序:

int main()
{float f=3.6;int i=f;cout<<i<<endl;system("pause");return 0;
}

会出现如下警告信息:1>ClCompile:1>f.cpp1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

若我们在程序上方添加:

#pragma warning(disable:4305)

则编译时警告信息会变为:


1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

若我们在程序上方添加:

#pragma warning(error:4244)

则警告信息会变为错误信息:

1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

#pragma comment:该指令将一个注释记录放入一个对象文件或可执行文件中。

  常用的lib关键字,可以帮我们连入一个库文件。例如:

#pragma comment(lib,"wsock32.lib")

#pragma disable:在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。一般在C51中使用较多。

转载于:https://www.cnblogs.com/alanfeng/p/5025413.html

常用C/C++预处理指令详解相关推荐

  1. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注 ...

  2. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  3. #pragma预处理指令详解

    #pragma预处理指令详解 在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保 ...

  4. C#中的预处理指令详解

    这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregion ...

  5. C语言中编译预处理命令作用,C语言预处理命令详解

    原标题:C语言预处理命令详解 关注百问科技并将它设为星标 不错过任何一篇嵌入式干货 ------ 作者:clover_toeic 原文出处: https://www.cnblogs.com/clove ...

  6. arm-linux-ld中的参数,arm-linux-ld指令详解

    arm-linux-ld指令详解 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系 ...

  7. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  8. Linux中的ps指令详解

    [时间]2018.12.16 [题目]Linux中的ps指令详解 转载地址:https://www.cnblogs.com/exe19/p/5511733.html 概述 要对进程进行监测和控制,首先 ...

  9. Angular ng-model指令详解

    Angular ng-model指令详解 声明 将输入域的值与 AngularJS 创建的变量绑定 双向数据绑定 表单验证 自定义类样式 常用应用状态 声明 本文根据菜鸟教程整理 http://www ...

最新文章

  1. servlet php,JSP和Servlet的区别及PHP类比
  2. ubuntu 安装Pangolin 过程_余辉亮的学习笔记的博客-CSDN博客_pangolin安装
  3. 2018 CVPR GAN 相关论文调研
  4. python多线程为什么要用队列_Python程序中的线程操作-线程队列
  5. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案
  6. Android模拟器体验有感
  7. Android5.0和6.0之后新增的控件说明
  8. 华为WLAN产品命名规范
  9. Android中Text文本特效处理
  10. php7和php5对比
  11. 已知两数的最大公因数和最小公倍数
  12. es6中 使用class里面的set和get 用法
  13. 【已解决】【V2版本】如何使用脚本关闭Win10自动更新服务并阻止其自动启动?
  14. 《Linux命令行与shell脚本编程大全》 第二十五章 学习笔记
  15. python随机生成20个数字_你如何在Python中生成20个随机数字
  16. 蓝牙mesh- Features和设备类型
  17. 树莓派如何重新装Linux系统,如何给树莓派Raspberry重新安装修复操作系统
  18. 〖Python 数据库开发实战 - MySQL篇⑨〗- 什么是 SQL 语言、如何创建数据逻辑库及如何创建数据表
  19. rx590 黑苹果 无货_应粉丝要求花9000配了一台高端黑苹果电脑,大家看看值不值吧!...
  20. 新的一周,新的旅程…

热门文章

  1. python除法保留两位小数_java实现两个整数相除保留一位小数
  2. r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
  3. mysql 自增长id string_Mysql中获取刚插入的自增长id的三种方法归纳
  4. Shiro配置cookie以及共享Session和Session失效问题
  5. php和gps终端设备通讯,运输车辆GPS定位+语音对讲通讯方案
  6. 【luogu1337】【JSOI2004】平衡点 / 吊打XXX(模拟退火)
  7. 【CSP201803-1 】跳一跳,简单模拟
  8. UVa10082 - WERTYU
  9. 本地mongo 连接远程数据库_本地搭建esaymock
  10. jQuery动画效果之上卷下拉