前言:
作者简介:爱吃大白菜1132
人生格言:纸上得来终觉浅,绝知此事要躬行
如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!
如果觉得博主文章还不错的话,希望三连支持!
目录
- __FILE__ //进行编译的源文件
- __LINE__ //文件当前的行号
- __DATE__ //文件被编译的日期
- __TIME__ //文件被编译的时间
- __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
以上预定义符号都是C语言内置的。
- 语法:
- #define name stuff
例如:
- #include
- #define MAX 10
-
- int main()
- {
- printf("%d\n", MAX);//打印10
- return 0;
- }
- 语法:
- #define name( parament-list ) stuff
注:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
- #include
- #define SUM(a,b) (a)+(b)
-
- int main()
- {
- printf("%d\n", SUM(2, 3));
- return 0;
- }
注:
由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
1. 在调用宏时,首先对宏中参数进行检查,检查是否包含任何由#define定义的符号。如果有,它们首先被替换。
2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有,就重复上述处理过程。
加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。
- #include <stdio.h>
-
- #define PRINT( VALUE,FORMAT) printf("the value of "#VALUE" is " FORMAT "\n", VALUE);
- int main()
- {
- int a = 3;
- PRINT(a,"%d");
- //预处理会替换为:
- //printf("the value of a is %d\n", a);
- }
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
- //FUC将c和h粘合到一起,相当于字符名ch
- #include
-
- #define FUC(A,B) A##B
-
- int main()
- {
- char ch[] = "hello world";
- printf("%s\n", FUC(c,h) );
- }
常见的条件编译指令:
- 1.
- #if 常量表达式
- //...
- #endif
- //常量表达式由预处理器求值。
- 如:
- #define __DEBUG__ 1
- #if __DEBUG__
- //..
- #endif
- 2.多个分支的条件编译
- #if 常量表达式
- //...
- #elif 常量表达式
- //...
- #else
- //...
- #endif
- 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
一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:
把宏名全部大写
函数名不要全部大写