#define <名字> <值>

  • 因为这是个编译预处理指令, 所以会在编译之前的把文中的宏替换

  • 值可以是什么样的(除了注释), 值里有空格, 标点符号也行也可以

  • define做的是那种最原始的文本的替换

#define FORMAT "%d\n",	// 我这里的这个注释是不会被包括进值内的
 
int main(){
    int a=20;
    printf(FORMAT a);
  
    return 0;
}

这样是成功的, 而且在编译预处理文件中, 就是完全的文本替换

  • 如果一个宏的值中有其他宏的名字, 也是会被直接替换的
  • 如果一个宏的值超过一行, 最后一行之前的行末需要加\
    • #define PRT printf(); \ /*这里来个换行*/ printf();
  • 宏的值后面的注释不会被当作宏的一部分
    • ""引号内的, //注释内的

没有值的宏

#define _DEBUG 不是说名字一定是这个, 只要值是空就可以 这类宏是用于条件编译的, 后面有其他的编译预处理指令来检查这个宏是否已经被定义过了 有印象: 用于大项目头文件玩的

预定义的宏

__LINE__ 这个代码在的行号 __FILE__ 这个代码的文件名 __DATE__ 编译时候的日期 __TIME__ 编译时候的时间 __STDC__ __func__ 当前所在的函数名

带参数的宏 (像函数的宏)

#define cube(x) ((x)*(x)*(x))

容易出错的情况

#define RAD1(x) (x * 57.29578)
#define RAD2(x) (x) * 57.29578
 
int main(){
	printf("%f\n", RAD1(5+2));
	printf("%f\n", 180/RAD2(1));
	return 0;
}

其实就是说一个纯文本替换的, 这里涉及了运算的优先级 所以

  • 一切都要有括号
    • 整个值要有括号
    • 参数出现的每个地方都要有括号

  • 也可以带多个参数
    • #define MIN(a,b) ((a)>(b)?(b):(a))
  • 也可以组成 (嵌套) 使用其他宏

*inline函数