C陷阱与缺陷(六)
2017-03-25 10:27
148 查看
C语言预处理器
如预处理指令:
预定义宏
ANSI C定义了一些宏。如:
printf("File:%s\n",__FILE__);
printf("Date:%s\n",__DATE__);
printf("Time:%s\n",__TIME__);
printf("Line:%d\n",__LINE__);
printf("Line:%d\n",__FUNCTION__);
预处理器运算符
C预处理器提供了以下运营商,以帮助您创建宏:
Macro Continuation (\)
宏通常必须被包含在一个单一的线。宏延续运算符用于继续宏一行太长。
Stringize (#)
stringize或数字符号运算符('#'),使用时,在宏定义,宏参数转换成一个字符串常量。这个操作符只可用于在一个宏,有一个指定的参数或参数列表。
如:
#definemessage_for(a,b) \
printf(#a"and"#b":Weloveyou!\n")
message_for(C,Macro);
Token Pasting (##)
在宏定义令牌粘贴运算符(##)结合两个参数。它允许两个单独的宏定义中的令牌被加入到一个单独的标记。
myprintf(color "<%s, %d> "##format, __FUNCTION__, __LINE__, ##args);
在C/C++的宏中,”#”的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。
而”##”被称为连接符(concatenator),用来将两个子串Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。还可以n个##符号连接n+1个Token,这个特性是#符号所不具备的。
宏定义使用总结
(1)宏定义注意写法,特别空格问题
(2)宏定义不是函数,不要在程序中当“函数”使用,
比如#define max(a,b) ((a)> (b) ? (a) : (b)),这种宏定义我们常用,但也要特别注意,不要代入复杂的参数
(3)宏不是语句,宏定义中语法不要太复杂,特别注意if 语句与外层的嵌套
(4)宏定义不是类型定义,程序中每条语句一行,也是有重要原因,尽量使用typedef而不是define
如预处理指令:
Directive | Description |
#define | Substitutes a preprocessor macro |
#include | Inserts a particular header from another file |
#error | Prints error message on stderr |
#pragma | Issues special commands to the compiler, using a standardized method |
预定义宏
ANSI C定义了一些宏。如:
Macro | Description |
__DATE__ | The current date as a character literal in "MMM DD YYYY" format |
__TIME__ | The current time as a character literal in "HH:MM:SS" format |
__FILE__ | This contains the current filename as a string literal. |
__LINE__ | This contains the current line number as a decimal constant. |
__STDC__ | Defined as 1 when the compiler complies with the ANSI standard. |
printf("Date:%s\n",__DATE__);
printf("Time:%s\n",__TIME__);
printf("Line:%d\n",__LINE__);
printf("Line:%d\n",__FUNCTION__);
预处理器运算符
C预处理器提供了以下运营商,以帮助您创建宏:
Macro Continuation (\)
宏通常必须被包含在一个单一的线。宏延续运算符用于继续宏一行太长。
Stringize (#)
stringize或数字符号运算符('#'),使用时,在宏定义,宏参数转换成一个字符串常量。这个操作符只可用于在一个宏,有一个指定的参数或参数列表。
如:
#definemessage_for(a,b) \
printf(#a"and"#b":Weloveyou!\n")
message_for(C,Macro);
Token Pasting (##)
在宏定义令牌粘贴运算符(##)结合两个参数。它允许两个单独的宏定义中的令牌被加入到一个单独的标记。
myprintf(color "<%s, %d> "##format, __FUNCTION__, __LINE__, ##args);
在C/C++的宏中,”#”的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。
而”##”被称为连接符(concatenator),用来将两个子串Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。还可以n个##符号连接n+1个Token,这个特性是#符号所不具备的。
宏定义使用总结
(1)宏定义注意写法,特别空格问题
(2)宏定义不是函数,不要在程序中当“函数”使用,
比如#define max(a,b) ((a)> (b) ? (a) : (b)),这种宏定义我们常用,但也要特别注意,不要代入复杂的参数
(3)宏不是语句,宏定义中语法不要太复杂,特别注意if 语句与外层的嵌套
(4)宏定义不是类型定义,程序中每条语句一行,也是有重要原因,尽量使用typedef而不是define
相关文章推荐
- 《C语言陷阱和缺陷》笔记
- C陷阱与缺陷(四)--声明与定义2
- C陷阱与缺陷总结
- C陷阱与缺陷第三章 语义“陷阱”
- C陷阱与缺陷第六章 预处理器
- 读书笔记--C陷阱与缺陷(五)
- C陷阱与缺陷(六)预处理器
- C Traps and Pitfalls (C语言陷阱和缺陷) 读书总结
- C陷阱与缺陷(二)之整型常量
- C陷阱与缺陷的学习笔记
- c缺陷与陷阱笔记-第四章 连接
- MINA,xSocket同样的性能缺陷及陷阱,Grizzly better
- C陷阱与缺陷二.2
- C语言陷阱和缺陷
- C陷阱与缺陷 笔记
- C语言的陷阱与缺陷
- (转载)C语言陷阱和缺陷
- C语言陷阱和缺陷
- C语言陷阱和缺陷
- C陷阱与缺陷学习笔记