c reference manual读书笔记(二)
这次主要是预处理器和宏处理的部分。
1 预处理器主要是处理源代码中以#开头的行,预处理器执行完毕后的代码必定是一个合法的c程序.
2 预处理器的命令是完全不依赖于c语言的语法的.
3 预处理器不会parse源代码,预处理的词法处理和编译器的是不同的,预处理器能够理解合法的c标记,可是它也会忽略在c编译器中认为是不合法标记。比如下面的代码,对于预处理器来说,没有任何问题的.
1 |
|
#define my_include #include
my_include <stdio.h>
1 |
|
#include <stdio.h>
1 |
|
#define BACKSLASH \
#define ASTERISK *
1 |
|
#define BACKSLASH #define ASTERISK *
1 |
|
#define N 5 ; //N将会被替换为5 ;
#define A = 3 //A将会被替换为 = 3
1 |
|
#define Test (a,b) a+b
Test(1,2)//将会被替换为(a,b) a+b(1+2)
1 |
|
#define insert(stm) stm
insert({a=1,b=1;}) //这个将会出错
insert({(a=1,b=1);})//这个才是正确的
1 |
|
#define plus(x,y) add(y,x)
#define add(x,y) ((x)+(y))
plus(plus(a,b),c)
1 |
|
add(c,plus(a,b))
c+plus(a,b)
c+add(b,a)
c+ b + a
1 |
|
#define F “asdfa
printf(F asf”);
1 |
|
#include < stdio.h>//这里将会出错
```
14 c99中对于所有的预处理器执行期间的算术操作都使用当前计算机的最大整数类型,比如intmaxt或者uintmax_t.这个其实主要是对于#if这类指令来说的.
15 #pragma是用来提供给编译器一些附加的信息的(因此各个编译器都实现了自己的信息,比如vc下的#prama once,gcc中的#pragma GCC dependency),而在c99中还提供了一个函数Pragma的操作符,比如Pragma(“argument”)是等同于#pragma argument的.而在gcc中早已经有一个类似pragma的东西,那就是__attribute,所以gcc中就很少很少使用pragma.更详细的可以看这里: