c++预编译命令
gcc 预编译指令

gcc 预编译指令
gcc预编译指令是指在编译源代码之前,对代码进行预处理的指令。
这些指令可以用来包含头文件、定义常量、宏和条件编译等。
预处理器会根据这些指令将代码转换为更适合编译器处理的形式。
常见的预编译指令有:
- #include:用于包含头文件。
- #define:用于定义常量和宏。
- #ifdef、#ifndef、#endif:用于条件编译,根据是否已定义某个宏来判断是否编译某段代码。
- #pragma:用于提供编译器特定的指令,例如优化选项等。
使用预编译指令可以提高代码的可读性和可维护性,同时也可以避免一些常见的错误。
但是,过度使用预编译指令也可能导致代码难以理解和调试。
因此,在使用预编译指令时,需要谨慎考虑其影响,并遵循良好的编码习惯。
- 1 -。
C中的几个预编译指令

##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c
main()
aabbcc
千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道##运算符。绝大多数程序员从来没用过它。
三、条件编译指令
条件编译指令将决定那些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。
int array[MAX_NUM];
for(i=0;i<MAX_NUM;i++) /*……*/
在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值。作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序红的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。
{
1.#define指令
#define预处理指令是用来定义宏的。该指令最简单的格式是:首先神明一个标识符,然后给出这个标识符代表的代码。在后面的源代码中,就用这些代码来替代该标识符。这种宏把程序中要用到的一些全局值提取出来,赋给一些记忆标识符。
#define MAX_NUM 10
volume=Cube(num);
num++;
3.#运算符
出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。例如:
#define PASTE(n) "adhfkj"#n
C语言第7章预编译命令

C语言程序设计教程
7.2带参宏定义
如果宏定义串中a 周围的括号被去掉,即: #define ABS(a) a<0?-a:a
则表达式: ABS( lO - 20) 将转换为: 1O – 20 < 0 ? -10 - 20 : 10 – 20
所以须特别注意宏定义中参数的括号问题!!
int a = 1308001,c = 1308002;
float b = 621,d = 612;
Print(Format,"Wangyi",a,b);
Print(Format,"Liwei",c,d);
return 0; 程序运行结果:
}
输出: Wangyi 1308001 621.00 14
Liwei 1308002 612.00
对语句:
printf("%f ",1T+H1R+E1E));;
12
C语言程序设计教程
7.1.2无参宏定义
如果串长于一行,可在行尾用反斜线“\”续行, 如:
#define LONG_STRING "this is a very long\ string that is used as an example"
习惯上宏名用大写字母表示,以便于与变量区 别。但也允许用小写字母。
13
C语言程序设计教程
7.1.2无参宏定义
例7.2 使用宏定义实现格式控制输出。
#include <stdio.h>
#define Print printf
#define Format "%10s%8d%8.2f\n"
C语言预处理命令总结大全.docx

C语言预处理命令总结大全(2012-02-13 17:18)标签:C语言预处理分类:C编程C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。
虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。
本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。
ANSI标准定义的C 语言预处理程序包括下列命令:#defi ne ,#error ,# in elude , #if , #else , #elif , #en dif , #ifdef , #if ndef , #undef, #line , #pragma等。
非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。
命令#define定义了一个标识符及一个串。
在源程序中每次遇到该标识符时,均以定义的串代换它。
ANSI标准将标识符定义为宏名,将替换过程称为宏替换。
命令的一般形式为:#define identifier string1该语句没有分号。
在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。
2宏名定义后,即可成为其它宏名定义中的一部分。
3宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。
例如:#defi ne XYZ this is a tes使用宏printf("XYZ") ;//该段不打印"this is a test"而打印"XYZ"。
因为预编译器识别出的是"XYZ"4如果串长于一行,可以在该行末尾用一反斜杠’\'续行。
#defi neLONG_STRING"this is a very long\stri ng that is used as an example"5 C语言程序普遍使用大写字母定义标识符。
6用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。
C语言的预处理命令有哪些?

问:关于C语言中的预处理命令?答:我们可以在C源程序中插入传给编译程序的各种指令,这些指令被称为预处理器指令(等价于汇编语言中的伪指令),它们扩充了程序设计的环境。
现把常用的预处理命令总结如下:1. 预处理程序按照ANSI标准的定义,预处理程序应该处理以下12条指令:#if、#ifdef、#ifndef、#else、#elif、#endif、#define、#undef、#line、#error、#pragma、#include。
显然,所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。
2. #define#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之(原样替换,不要附加任何人为理解上的符号)。
这种标识符称为宏名字,相应的替换称为宏代换。
一般形式如下:#define macro-name char-sequence这种语句不用分号结尾。
宏名字和串之间可以有多个空格符,但串开始后只能以新行终止。
在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以宏定义的语句结尾不需要加分号。
宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:#define LEFT 1#define RIGHT 0每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。
定义一个宏名字之后,可以在其他宏定义中使用,例如:#define ONE 1#define TWO ONE+ONE#define THREE ONE+TWO宏代换就是用相关的串替代标识符。
因此,如果希望定义一条标准错误信息时,可以如下定义:#define ERROR_MS “Standard error on input \n”如果一个串长于一行,可在行尾用反斜线”\”续行,如下:#define LONG_STRING “This is a very very long \s tring that is used as an example”3. #error#error指令强制编译程序停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误的分支就显示该信息)。
cmake windows 预编译

cmake windows 预编译
在Windows上使用CMake进行预编译通常涉及使用预编译头文件来加速编译过程。
预编译头文件是一个已编译的二进制文件,包含了源代码中所有头文件的内容。
当编译器编译源代码时,它会直接使用预编译头文件,而不是重新解析和编译头文件,从而显著加快编译速度。
以下是在Windows上使用CMake进行预编译的一般步骤:
1. 配置CMake:
打开命令行终端(如命令提示符或PowerShell)。
导航到项目根目录。
运行CMake,指定预编译头文件的路径。
例如,如果预编译头文件位于`./precompiled`目录中,可以运行以下命令:
```
`cmake -H. -Bbuild -DPRECOMPILED_HEADER=ON -DPRECOMPILED_DIR=./precompiled`
```
这将生成一个`build`目录,其中包含CMake生成的构建文件。
2. 构建项目:
进入`build`目录。
运行构建命令。
例如,使用Visual Studio的命令提示符可以运行以下命令:
```
`cmake --build .`
```
这将使用预编译头文件进行构建。
3. 清理构建:
如果需要清理构建输出,可以运行以下命令:
```
css`cmake --clean-first .`
```
这将清除构建输出,以便重新构建项目。
请注意,具体的CMake命令和参数可能会因项目和使用的编译器而有所不同。
上述步骤提供了一般的指导,可能需要根据实际情况进行调整。
c语言的预处理指令分3种 1宏定义 2条件编译 3文件包含

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。
⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。
3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。
只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。
如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。
《C程序设计》(第三版)第9章 预处理命令

②为了增加程序的可读性,建议宏名用大写字母, 为了增加程序的可读性,建议宏名用大写字母, 其他的标识符用小写字母。 其他的标识符用小写字母。 双引号中有与宏名相同的字符串不进行替换。 有与宏名相同的字符串不进行替换 ③双引号中有与宏名相同的字符串不进行替换。 已经定义的宏名可以被后定义的宏名引用。 ④已经定义的宏名可以被后定义的宏名引用。在预 处理时将层层进行替换。 处理时将层层进行替换。
main() 替 { float r,s,c; 换 scanf(“%f” scanf(“%f”,&r); s = 3.14 * r * r ; PI printf(“PI=%f,s=%f” PI printf(“PI=%f,s=%f”, 3.14 ,s); }
编译
说明: 说明:
① 宏定义的作用域是从定义处开始到源文件结束, 宏定义的作用域是从定义处开始到源文件结束, 但根据需要可用undef命令终止其作用域 命令终止其作用域。 但根据需要可用undef命令终止其作用域。 形式为: 形式为: #undef 宏名
【例3】分析下面程序运行后的输出结果。 】分析下面程序运行后的输出结果。 #define MA(x) x*(x-1) void main( ) 特别注意: 特别注意: { int a=1,b=2; 由于替换文 本中的x没 本中的 没 printf("%d\n", MA(1+a+b)); 有用括号括 } 因此, 起,因此, 程序输出结果: 程序输出结果:8 1+a+b也不 也不 分两次替换: 分两次替换: 能用括号括 ①MA(1+a+b) 用x*(x-1) 替换。 MA(1+a+b) 替换。 起。 替换x。 ②用1+a+b替换 。 替换 printf语句被展开为: 语句被展开为: 语句被展开为 printf("%d\n", 1+a+b*(1+a+b-1));
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。
Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。
其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。
假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。
我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
(2)另一个使用得比较多的pragma参数是code_seg。
格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。
BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A 编译。
你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。
*.dfm中包括窗体外观的定义。
(6)#pragma warning( disable : 4507 34; once : 4385; e rror : 164 )等价于:#pragma warning(disable:4507 34) // 不显示4507和34号警告信息#pragma warning(once:4385) // 4385号警告信息仅报告一次#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:#pragma warning( push [ ,n ] )#pragma warning( pop )这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。
例如:#pragma warning( push )#pragma warning( disable : 4705 )#pragma warning( disable : 4706 )#pragma warning( disable : 4707 )//.......#pragma warning( pop )在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。
一、预编译头文件说明所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。
这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。
stdafx.h这个头文件名是可以在project的编译设置里指定的。
编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。
另外,每一个实现文件CPP都包含了如下语句:#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif这是表示,如果生成调试版本,要指示当前文件的名称。
__FILE__是一个宏,在编译器编译过程中给它赋值为当前正在编译的文件名称。
默认情况下使用预编译头(/Yu),不明白的在加入新.h文件后编译时总出现fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾的错误。
解决方法是在include头文件的地方加上#include "stdafx.h",或者打项目属性,找到“C/C++”文件夹,单击“预编译头”属性页。
修改“创建/使用预编译头”属性为“不使用预编译头”。
二、C/C++头文件一览C、传统 C++#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入/输出#include <iomanip.h> //参数化输入/输出#include <iostream.h> //数据流输入/输出#include <limits.h> //定义各种数据类型最值常量#include <locale.h> //定义本地化函数#include <math.h> //定义数学函数#include <stdio.h> //定义输入/输出函数#include <stdlib.h> //定义杂项函数及内存分配函数#include <string.h> //字符串处理#include <strstrea.h> //基于数组的输入/输出#include <time.h> //定义关于时间的函数#include <wchar.h> //宽字符处理及输入/输出#include <wctype.h> //宽字符分类标准 C++ (同上的不再注释)#include <algorithm> //STL 通用算法#include <bitset> //STL 位集容器#include <cctype>#include <cerrno>#include <clocale>#include <cmath>#include <complex> //复数类#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque> //STL 双端队列容器#include <exception> //异常处理类#include <fstream>#include <functional> //STL 定义运算函数(代替运算符)#include <limits>#include <list> //STL 线性列表容器#include <map> //STL 映射容器#include <iomanip>#include <ios> //基本输入/输出支持#include <iosfwd> //输入/输出系统使用的前置声明#include <iostream>#include <istream> //基本输入流#include <ostream> //基本输出流#include <queue> //STL 队列容器#include <set> //STL 集合容器#include <sstream> //基于字符串的流#include <stack> //STL 堆栈容器#include <stdexcept> //标准异常类#include <streambuf> //底层输入/输出支持#include <string> //字符串类#include <utility> //STL 通用模板类#include <vector> //STL 动态数组容器#include <cwchar>#include <cwctype>using namespace std;C99 增加#include <complex.h> //复数处理#include <fenv.h> //浮点环境#include <inttypes.h> //整数格式转换#include <stdbool.h> //布尔环境#include <stdint.h> //整型环境#include <tgmath.h> //通用类型数学宏三、预处理的由来在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个。