C语言深度解剖(第三章-预处理读书笔记)

3.1宏定义

3.1.1 数值宏常量
#define定义的常量从本行宏定义开始,以后代码都认识这个宏,任何东西都可定义为宏。
编译器在预处理时就会用真身替换替身

eg:

#define PI 3.141592654

以后的代码就可以用PI来代替3.141592654,这样的好处是如果你想提高精度,只需要修改一次。
#define定义的宏是没有类型的,而const修饰的数据是有类型的,为了安全建议以后定义宏常量时尽可能用const代替,编译器会给const修饰的只读变量做类型校检,减少错误。

eg:

#define MAX 100
建议使用
const int MAX=100

要注意const修饰的不是常量而是readonly变量,const修饰的只读变量不能用来作为定义数组的维数,也不能放在case关键字后面

eg:

int Array[MAX];
这个MAX可以用#define定义,但不能用const定义

#define FUN(a) "a"
int main()
{
    char* str=FUN(345);
    printf("%s\n",str);  //输出结果:"a"
    printf(FUN(345));//输出结果:"a"
    printf("FUN(345)");//输出结果:"FUN(345)"
    return 0;
}

3.1.2 字符宏常量
除了定义宏常数外,经常还用来定义字符串,尤其路径

#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3 

3.7 #运算符

eg:

#define SQR(x) printf("The square of x is %d.\n", ((x)*(x))); 如果这样使用宏:
SQR(8);
则输出为:The square of  x   is 64.

注意到没有,引号中的字符 x 被当作普通文本来处理,而不是被当作一个可以被替换的语言符号。

假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转化为字符串。上面的例子改一改:

#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
再使用:SQR(8);

则输出的是:The square of 8   is 64.

3.8 ##运算符

##运算符可把两个语言符号组合成单个语言符号。
eg:

#define XNAME(n)    x ## n

如果这样使用宏:
XNAME(8)
则会被展开成这样:
x8
发布了57 篇原创文章 · 获赞 12 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章