1、预定义符号
在我们的编译器上面有一些内置的符号
编译出来的结果就是
2、#define符号的使用
2.1#define的语法使用 :
#define name stuff,使用规则:定义后在进行编译的预处理时会把所有的预定义符号全部都用后面的数字或者符号替换。
例子如下:
不仅如此还可以这样#define arr for(;;)这样定义,但是这样是死循环。
2.2用#define去定义宏
#define的机制包括了一个规定,允许把参数替换到文本中,这种实现通常称位宏或定义宏。
使用语法:#define name(parament-list )stuff
使用表现:
其中的parament-list是一个由逗号隔开的符号表,它们可能出现在stuff中。
请注意:参数列表的左括号必须要与name紧邻。
如果两者之间有任何空白的存在,参数列表就会被稀释为stuff的一部分。
2.3在使用中宏需要注意的事情
1、在使用宏的时候要注意结合预处理时的替换规则和宏的运算优先级来使用宏。
例子如下:
有的人认为定义的add定义的宏是30乘上前面的4就是120,但是结果如下:
结果却是60,原因是在预处理阶段把预定义的符号全都换了导致成int c=4*10+20,结果就变成了60。
同理如下:
2、在使用宏的时候要注意不要在定义后面加上符号“;”,因为;加上这个符号在预处理阶段会连着这个符号一起替换掉就导致你在一句话结尾的时候加上了“;”但是在替换后有加了这个符号导致了代码报错。
、
3、#和##两个符号的解释和使用
思考一个问题:我们如何使用宏把参数给打印出来?
tip:我们在使用printf函数的时候是具有自动连接的功能特点的。
int main()
{
printf("hello"" world");
return 0;
}
运行的结果如下:
1、#讲解
在打印参数的时候加上“#”可以把它转换成参数 对比如下:
接下来的是使用宏来定义的打印。
2、##讲解
“##”符号就是把两个字符合在一起。
例子:
4、#undef、命令行定义和条件编译
1、#ifdef和#endif的使用:
2、#if #elif #enif的使用:
3、当做判断指令:
#if defined(symbol) //等于 #ifdef symbol
#if !defined(symbol)// #ifndef symbol
4、嵌套的使用:
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif