一、条件编译使用分析
---条件编译的行为类似于C语言中的if...else
---条件编译是预编译指示命令,用于控制是否编译某段代码。
二、#include的困惑
---#include的本质是将已经存在的文件内容嵌入到当前文件中。
---#include的间接包含同样产生嵌入文件内容的动作。
三、条件编译的意义
---条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码
---#if…#else…#endif被预编译器处理;而if…else语句被编译器处理,必然被编译进目标代码
---实际工程中条件编译主要用于一下两种情况:
不同的产品线共用一份代码
区分编译产品的调试版和发布版
Example:
1 #include
2
3 #ifdef DEBUG
4 #define LOG(s) printf("[%s:%d] %s\n",__FILE__,__LINE__,s);
5 #else
6 #define LOG(s) NULL
7 #endif
8
9 #ifdef HIGH
10 void f()
11 {
12 printf("This is the high level product\n");
13 }
14 #else
15 void f()
16 {
17
18 }
19 #endif
20
21 int main()
22 {
23 LOG("Enter main()...");
24 f();
25 printf("1.Query Information\n");
26 printf("2.Record Information\n");
27 printf("3.Delete Information\n");
28
29 #ifdef HIGH
30 printf("4.High level Query\n");
31 printf("5.Mannul service\n");
32 printf("6.Exit\n");
33 #else
34 printf("4.Exit\n");
35 #endif
36 LOG("Exit main()....");
37 return 0;
38 }
调试:
gcc -DDEBUG -DHIGH debug.c
gcc -DHIGH debug.c
gcc -DDEBUG debug.c
四、#pragma预处理分析
1.#pragma简介
---#pragma是编译器指示字,用于指示编译器完成一些特定的动作
---#pragma所定义的很多指示字是编译器和操作系统特有的
---#pragma在不同的编译器间是不可移植的
---预处理器将忽略它不认识的#pragma指令
---两个不同的编译器可能以两种不同的方式解释同一条#pragma指令,一般用法:
#pragma parameter
注:不同的parameter参数语法和意义各不相同
2.#pragma message
---message参数在大多数的编译器中都有相似的实现
---message参数在编译时输出消息到编译输出窗口中
---message可用于代码的版本控制
3.#pragma pack
---什么是内存对齐?不同类型的数据在内存中按照一定的规则排列;而不是顺序的一个接一个的排放,这就是对齐。
两种类型所占的内存空间是否相同?
1 #include
2
3 struct Test1
4 {
5 char c1;
6 short s;
7 char c2;
8 int i;
9 };
10 struct Test2
11 {
12 char c1;
13 char c2;
14 short s;
15 int i;
16 };
17
18 int main()
19 {
20 printf("%d\n",sizeof(struct Test1));//12
21 printf("%d\n",sizeof(struct Test2));//8
22 return 0;
23 }
---为什么需要内存对齐?
(1)CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16字节
(2)当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣
(3)某些硬件平台只能从规定的地址处取某些特定类型的数据,否则抛出硬件异常
(4)#pragma pack能够改变编译器的默认对齐方式
4.struct占用内存大小
(1)第一个成员起始于0偏移处
(2)每个成员按其类型大小和指定对齐参数n中较小的一个进行对齐
------偏移地址和成员占用大小均需对齐
------结构体成员的对齐参数为其所有成员使用的对齐参数的最大值
(3)结构体总长度必须为所有对齐参数的整数倍
Example:Inter和微软面试题
1 #include
2
3 #pragma pack(8)
4
5 struct S1
6 {
7 short a;
8 long b;
9 };
10 struct S2
11 {
12 char c;
13 struct S1 d;
14 double e;
15 };
16
17 #pragma pack()
18
19 int main()
20 {
21 struct S2 s2;
22
23 printf("%ld\n",sizeof(struct S1));//8
24 printf("%ld\n",sizeof(struct S2));//24
25 printf("%d\n",(int)&(s2.d) - (int)&(s2.c));//4
26 return 0;
27 }
阅读(1830) | 评论(0) | 转发(0) |