你必须知道的C语言预处理的问题详解

本篇文章介绍了,你必须知道的C语言预处理的问题。需要的朋友参考下

  C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:

  1.三字母词(Trigraph Sequences)

  C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.

三字母词单字符
??=#
??/\
??'^
??([
??)]
??!|
??<{
??>}
??-~

  替换发生在任何其他处理之前。

  例如:如果你尝试打印字符串"what??!"  

复制代码 代码如下:

 printf("what??!\n");

  会得到字符串"what|"。

  如果你这样注释代码,结果会让你意外:  

复制代码 代码如下:

// Will the next line be executed?????????????/
a++;

  a++并不会执行。前提是你知道\的作用。

  注意:由于编译器对ANSI C的支持不一样,有些编译器会把三字母词当普通字符处理,你需要给编译选项加上“-trigraphs”

  2.行拼接

  以反斜杠"\"结尾的行会把该行和下一行拼接成一行(预处理器做的工作就是把该反斜杠'"\"和接着的换行字符'\n'删除)。['\'称为续行符]

  例如你可以这样写

复制代码 代码如下:

/\
* is a legal comment. *\
/

  3.宏定义和展开

  a)简单宏替换

  简单宏替换使程序中能用一个标识符来表示一个单词串,指令形式为:

复制代码 代码如下:

#define 标识符 单词串

  标识符(称为宏名)被定义为后面的单词串;单词串(简称串)是任意以换行结束的用于替换程序中该标识符的正文。如果串太长需要写成多行,则除了最后一行外每一行末尾都要有一个续行符(即添加一个“\”后回车)。

  注意:字符串常数中出现的与宏名相同的字符串不在替换之列。例如:

复制代码 代码如下:

#define YES 1
printf("YES");            // 输出 YES,而不是1

  b)带参数的宏替换

  预处理指令的形式为:

复制代码 代码如下:

#define    标识符(标识符,标识符,...,标识符)    单词串

  “标识符(标识符,标识符,...,标识符)”是被定义的宏,()外面的标识符称为宏名,()中的标识符是宏的形式参数;宏名与其后的()之间不能有空白符。

  例如:  

复制代码 代码如下:

#define max(a,b) ((a)>(b)? (a): (b))

  ♦操作符#和##

    操作符#把其后的串变成双引号包围的串;

    操作符##把两个标志符拼在一起,形成一个新的标识符

复制代码 代码如下:

#define str(expr)    #expr
#define cat(x,y)      x ## y

int ab=12;
printf(str(hello world!));      // 会被替换成 printf("hello world!");
printf("ab=%d\n", cat(a,b));        // 会被替换成 printf("ab=%d\n", ab);  输出 ab=12

以上就是你必须知道的C语言预处理的问题详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言