36.0、C语言——C语言预处理(4) - 条件编译
命令行定义:
? ? ? ? 许多 C? 的编译器提供了一种能力,允许在命令行中定义符号;用于启动编译过程;例如:当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性就有点用处了;(嘉定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大写,我们需要一个数组能够大写);
实例代码如下所示 ->?
int main() {
int arr[SZ] = { 0 };
int i = 0;
for (i = 0;i < SZ;i++) {
arr[i] = i;
}
for (i = 0; i < SZ; i++) {
printf("arr[%d] = %d",i,arr[i]);
}
return 0;
}
? ? ? ? 1. 上述代码中,数组的长度 SZ 我们并没有定义,但是我们可以在程序预编译之前,用命令行打开这个程序然后命令行去定义一个 SZ 即可【这个操作在我们的 Linux 系统中比较好操作】 ;
? ? ? ? 2. 编译指令,如下所示?->
????????gcc -D SZ = 10 test.c
条件编译 【如果满足条件 -> 包含的代码就参与编译,反之不参与编译】
? ? ? ? 在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的;因为在预处理指令中 -> 我们有条件编译指令;
比如说:
? ? ? ? 调试性的代码删除可惜,保留又碍事,所以我们可以选择性的编译;
实例代码,如下所示:
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0;i < 10;i++) {
arr[i] = 0;
#ifdef DEBUG
printf("%d\n",arr[i]);
#endif
}
return 0;
}
for循环语句中 ->
????????#ifdef DEBUG ?? ??? ?????????printf("%d\n",arr[i]); ????????#endif
? ? ? ? 1. 这里表示在预编译阶段查看 -> 如果 DEBUG 这个标识符定义了,就执行里面的代码;如果未定义,那里面的代码就不参与编译,就不执行;
? ? ? ? 2. 上述代码中明显未定义 DEBUG 所以不执行,但是如果想要参与编译且执行,只需要在上面定义 #define DEBUG 即可;
下面给大家再介绍几种 条件预编译指令:
?1. if 条件预编译
? ? #if 常量表达式 ????????......... ? ? #ifend
int main() {
#if 1 //这里 1 改成 0 就为假,就不执行下面的 printf 语句
printf("蓝色海湾");
#ifend
return 0;
}
?2. 条件预编译——多分支
#if 常量表达式
????????????????//... #elif 常量表达式 ? ? ? ? ? ? ? ? //... #else? ? ? ? ? ? ? ? ? //... #endif
实例代码如下所示 ->
int main() {
#if 1==1
printf("1==1");
#elif 2==1
printf("2==1");
#else?
printf(澜色海湾);
#endif
return 0;
}
?3. 条件预编译——判断是否被定义
int main() {
#if defined(DEUBG);
printf("澜色海湾\n");
#endif
//这两种定义的方式不同,但是作用是一样的
#ifdef DEBUG
printf("澜色海湾\n");
#endif
//相反逻辑定义,当我们未定义的时候执行里面代码,定义的时候不参与编译、不执行,在前面加上感叹号即可
#if !defined(DEUBG);
printf("澜色海湾\n");
#endif
//这两种定义的方式不同,但是作用是一样的
#ifndef DEBUG
printf("澜色海湾\n");
#endif
return 0;
}
? ? ? ? 如上述代码,如果 标识符 DEBUG 在上面定义过了,则会执行里面的 printf() 语句;
4. 条件预编译——嵌套指令
int main() {
#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
return 0;
}
将条件编译指令嵌套的去使用;
|