Chinaunix首页 | 论坛 | 博客
  • 博客访问: 321405
  • 博文数量: 64
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1972
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 21:53
个人简介

文明之精神,野蛮之体魄。

文章分类
文章存档

2015年(4)

2013年(60)

我的朋友

分类: C/C++

2013-09-09 17:30:40

一、条件编译使用分析
---条件编译的行为类似于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) |
给主人留下些什么吧!~~