C语言-条件编译使用分析

1、基本概念

  条件编译的行为类似于C语言中的if…else… 

  条件编译是预编译指示命令,用于控制是否编译某段代码

2、实例分析

条件编译初探     22-1.c

 1 #include <stdio.h>  
 2   
 3 #define C 1  
 4   
 5 int main()  
 6 {  
 7     const char* s;  
 8   
 9     #if( C == 1 )  
10         s = "This is first printf...\n";  
11     #else  
12         s = "This is second printf...\n";  
13     #endif  
14   
15     printf("%s", s);  
16       
17     return 0;  
18 }  

3、条件编译的本质

  预编译器根据条件编译指令有选择的删除代码 

  编译器不知道代码分支的存在 

  if. .. else ... 语句在运行期进行分支判断 

  条件编译指令在预编译期进行分支判断 

  可以通过命令行定义宏 

               -  gcc -Dmacro=value file.c 或 gcc -Dmacro file.c

4、#include的本质

  #include的本质是将已经存在的文件内容嵌入到当前文件中 

  #include的间接包含同样会产生嵌入文件内容的操作

 

如何解决间接包含同—个头文件产生编译错误?

解决方案:

1 #ifndef _HEADER_FILE H   
2   
3 #define _HEADER_FILE H   
4   
5   // source code   
6   
7 #endif   

5、实例分析

条件编译的使用    

global.h

1 // global.h  
2 #ifndef _GLOBAL_H_  
3 #define _GLOBAL_H_  
4 int global = 10;  
5   
6 #endif  

test.h

 1 // test.h  
 2   
 3 #ifndef _TEST_H_  
 4 #define _TEST_H_  
 5 #include "global.h"  
 6   
 7 const char* NAME = "test.h";  
 8 char* hello_world()  
 9 {      
10     return "Hello world!\n";  
11 }  
12   
13 #endif  

22-3.cpp

 1 //#include <stdio.h>  
 2 #include "test.h"  
 3 #include "global.h"  
 4   
 5 int main()  
 6 {  
 7     const char* s = hello_world();  
 8     int g = global;  
 9       
10     // printf("%s\n", NAME);  
11     // printf("%d\n", g);  
12       
13     return 0;  
14 }  

条件编译可以解决头文件重复包含的编译错误 

 

7、条件编译的意义 

  条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码 

  #if…#else…#endif被预编译器处理,而if…else .. 语句被编译器处理,必然被编译进目标代码 

实际工程中条件编译主要用于以下两种情况: 

      -不同的产品线共用一份代码 

      -区分编译产品的调试版和发布版

 

8、实例分析

产品线区分及调试代码应用     product.h     22-4.c

product.h

1 #define DEBUG 1  //调试版
2 #define HIGH  1  //高端产品

22-4.c

 1 #include <stdio.h>  
 2 #include "product.h"  
 3   
 4 #if DEBUG  
 5     #define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)  
 6 #else  
 7     #define LOG(s) NULL  
 8 #endif  
 9   
10 #if HIGH  
11 void f()  
12 {  
13     printf("This is the high level product!\n");  
14 }  
15 #else  
16 void f()  
17 {  
18 }  
19 #endif  
20   
21 int main()  
22 {  
23     LOG("Enter main() ...");  
24       
25     f();  
26       
27     printf("1. Query Information.\n");  
28     printf("2. Record Information.\n");  
29     printf("3. Delete Information.\n");  
30       
31     #if HIGH  
32     printf("4. High Level Query.\n");  
33     printf("5. Mannul Service.\n");  
34     printf("6. Exit.\n");  
35     #else  
36     printf("4. Exit.\n");  
37     #endif  
38       
39     LOG("Exit main() ...");  
40       
41     return 0;  
42 }  

9、小结

        通过编译器命令行能够定义预处理器使用的宏 

        条件编译可以避免围复包含头同—个头文件 

        条件编译是在工程开发中可以区别不同产品线的代码 

        条件编译可以定义产品的发布版和调试版

posted @ 2018-12-16 20:11  lemaden  阅读(1490)  评论(0编辑  收藏  举报