在C语言中:
- 条件编译的行为类似于C语言中的 if…else…
- 条件编译是预编译指示命令,用于控制是否编译某段代码
/*测试代码*/
#include <stdio.h>
#define C 1
int main()
{
#if(C == 1)
printf("This is first printf...\n");
#else
printf("This is second printf...\n");
#endif
return 0;
}
运行结果
This is first printf...
条件编译的本质
预编译器根据条件编译指令按不同的条件编译不同的代码段, 因而可以产生不同的目标代码
编译器不知道代码分支的存在
if…else…语句在运行期进行分支判断
条件编译指令在预编译期进行分支判断
实际工程中条件编译主要用于以下两种情况:
- 不同的产品线共用一份代码
- 区分编译产品的调试版和发布版
可以通过命令行定义宏
gcc -D macro=value file.c 或 gcc -D macro file.c
#include的本质分析
- #include 的本质是将已经存在的文件内容嵌入到当前文件中
- #include 的间接包含同样会产生嵌入文件内容的操作
- 重复包含文件内容, 程序将产生编译错误
条件编译可以解决头文件重复包含的编译错误
/* header_file.h */
#ifndef _HEARDER_FILE_H_
#define _HEARDER_FILE_H_
// ..............
#endif
#error的用法
#error是一种预编译器指示字
#error可用于提示编译条件是否满足
#error用于生成一个编译错误消息
- 用法:
#error message (message 不需要用双引号保围)
- 用法:
编译过程中的任意错误信息意味着程序无法生成最终的可执行程序
类似的, #warning用于生成编译警告
/* 测试代码 */
#include <stdio.h>
void f()
{
#if ( PRODUCT == 1 )
printf("This is a low level product!\n");
#elif ( PRODUCT == 2 )
printf("This is a middle level product!\n");
#elif ( PRODUCT == 3 )
printf("This is a high level product!\n");
// 当 PRODUCT 未宏定义时,生成一条错误信息
#else
#error The macro PRODUCT is NOT define
#endif
}
int main()
{
f();
printf("1. Query Information.\n");
printf("2. Record Information.\n");
printf("3. Delete Information.\n");
#if ( PRODUCT == 1 )
printf("4. Exit.\n");
#elif ( PRODUCT == 2 )
printf("4. High Level Query.\n");
printf("5. Exit.\n");
#elif ( PRODUCT == 3 )
printf("4. High Level Query.\n");
printf("5. Mannul Service.\n");
printf("6. Exit.\n");
// 当 PRODUCT 未宏定义时,生成一条错误信息
#else
#error The macro PRODUCT is NOT define
#endif
return 0;
}
#line的用法
#line用于强制指定新的行号和编译文件名,并对源程序的代码重新编号
用法: #line number filename
#line编译器指示字的本质是重定义 __LINE__ 和 __FILE__
/* 测试代码 */
#include < stdio.h >
int main()
{
printf("%s, %d\n", __FILE__, __LINE__);
#line 1 "HSD.c"
printf("%s, %d\n", __FILE__, __LINE__);
return 0;
}
运行结果
..\C_Main\main.c, 5
HSD.c, 2