您的位置:首页 > 其它

C陷阱与缺陷(六)

2017-03-25 10:27 148 查看
C语言预处理器

如预处理指令:

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("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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: