C语言:宏定义
宏的作用:
定义常量
定义傻瓜表达式:
只作为符号替换:
#define S(a, b) a * b // S(1+2, 2+3) // 1+ 2*2 + 3 = 8
定义代码段:
#define P(a) {\ printf("%d\n", a); \ }
'\' 为连接符,因为C规定,宏定义只能写在一行,为了可读性使用多行,并用'\'连接。
预定义宏:
预处理命令:
条件式编译:代码剪裁,增加可移植性
#ifdef DEBUG #ifndef DEBUG #if MAX_N == 5 //宏MAX_N是否等于5 #elif MAX_N == 4 //宏MAX_N是否等于4 #else #endif
作用阶段:
对象文件在linux下是.o文件,在windows下是.obj文件。每个c源码文件对应一个对象文件。
将对象文件链接后生成可执行文件,在linux下是.out文件,在windows下是.exe文件。
实用例子:
实现MAX(a, b)
测试用例:
MAX(2, 3) 5 + MAX(2, 3) MAX(2, MAX(3, 4)) MAX(2, 3 > 4 ? 3 : 4) MAX(a++, 6)
linux可以通过gcc -E来查看预编译后的代码。
以下代码可以实现
#include<stdio.h> #define MAX(a, b) ({\ __typeof(a) _a = (a);\ __typeof(b) _b = (b);\ (_a) > (_b) ? (_a) : (_b);\ }) #define P(func){\ printf("%s = %d\n", #func, func);\ } int main(){ P(MAX(2, 3)); P(5 + MAX(2, 3)); P(MAX(2, MAX(3, 4))); int a = 7; P(MAX(a++, 6)); printf("a=%d\n", a); return 0; }
Note: __typeof 在linux下可用