Linuxc基础 二十四

宏定义

定义宏之后编译器会在预编译的时候用真身替换替身。
在用字符串宏常量时因为路径太长,一行写下来比较别扭时,用反斜杠接续符。
用宏定义表达式时要注意:函数宏被调用时是以实参代换形参,而不是“值传递”。
1、c的宏只能扩展为用大括号括起来的初始化、常量、小括号括起来的表达式、类型限定符、存储类标识符或do-while-zero结构(尽量少用此结构)。
2、函数宏的调用不能缺少参数,如果此函数宏有参数的话。
3、传递函数宏的参数不能包含看似预处理指令的标记。
4、在定义函数宏时,每个参数实例都应该以小括号括起来,除非他们作为#或##的操作数。
5、defined预处理操作符只能使用两种标准形式之一。
defined预处理操作符的两种可允许的形式为:

defined(identifider)
defined identifier

#undef是用来撤销宏定义的。
1、宏不能在块中进行#define和#undef
2、不要使用#undef
3、尽量使用普通的函数,而不要使用“宏定义函数”。
4、预处理指令中所有宏标识符在使用前都应该先定义,除了#ifdef和#ifndef指令及defined()操作符。

条件编译

条件编译有3种形式:
1、

#ifdef标识符
程序段1
#else
程序段2
#endif

功能是:如果标识符已被#define命令定义过,则对程序段1进行编译否则对程序段2进行编译。
2、

#ifndef标识符
程序段1
#else
程序段2
#endif

功能是:如果标识符未被#define命令定义过,则对程序段1进行编译否则对程序段2进行编译。
3、

#if常量表达式
程序段1
#else
程序段2
#endif

功能是:如果常量表达式的值为真(非0),则对程序段1进行编译否则对程序段2进行编译。
所有的#else、#elif和#endif预处理指令应该同与他们相关的#if或#ifdef指令放在相同的文件中。
文件包含:
1、格式1:

#include<filename>

2、格式2:

#incude“filename”

#error预处理:
作用是:编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。

#error error -message

注意:宏串error -message不用双引号包围。
#pragma message
message参数:他能够在编译信息输出窗口中输出相应的信息。

#pragma message(“消息文本”)

”##“运算符

在单一的宏定义中,最多可以出现一次“#”或“##”预处理器操作符。

猜你喜欢

转载自blog.csdn.net/qq_41936758/article/details/84945502