C预编译处理
C语言预编译处理包含三个方面,宏定义,与及条件编译,文件包含
1.宏定义
解析:用一个指定的标志符来代表一个字符串
#define PI 3.141592653
无参数宏定义
- 无参数
- 一般大写
- 有得于统一替换(直接修改数值,所有地方都跟着修改)
- 末尾不能加分号(比如#define PI 3.141592653; 程序中 float area = PI*3*3;宏展开得到结果:float area = 3.141592653;*3*3,编译报错)
- 可以层层替换(宏可以使用之前已定义的宏)
- ""号内不转换(printf("PI is a float numer:");语句中的PI在引号""中,不进行宏展开)
- 只作字符替换,不分配空间(相对于变量)
带参数宏定义
#define ADD(a, b) a+b
- 对参数字符作统一替换
- 宏名与括号不能加空格
- 统一替换要注意出错,如#define AREA(r) 3.14*r*r/2原意是得到圆的面积,AREA(a+b)宏展开结果:3.14*a+b*a+b/2,与预期不符合,所以得在r上加括号#define AREA(r) 3.14*(r)*(r)/2
#与##
宏定义中,#表示将两个字符串相连,可以理解为在宏两边加上引号:
#include <stdio.h> #define PRINT(w,h) printf("Your input is " #w #h "\n"); int main(int argc, char* args[]) { PRINT(3,4);return 0; }
输出结果为:
Your input is 34
带#号参数的宏在展开后得到的结果是:
printf("Your input is " "3" "4" "\n");
##表示该参数是一个变量的一部分
#include <stdio.h> #define PRINT(w,h) printf("Your input is" #w #h "df\n"); #define VAR_PRE(name) var_##name int main(int argc, char* args[]) { PRINT(3,4); int VAR_PRE(count) = 5; printf("%d\n", VAR_PRE(count)); return 0; }
##将name参数与var_结合,相当于往count变量赶回前缀,以区分不同的类别
可变参数...
C++宏定义中的可变参数表示是...,在宏定义中访问该参数的方法是__VA_ARGS__
#include <stdio.h> #define PRINT_ALL(...) printf(#__VA_ARGS__ "\n") int main(int argc, char* args[]) { PRINT_ALL(A, B, C); return 0; }
输出结果为:A, B, C
单独访问具体的某一参数(这个暂时未看到方法)
2.条件编译
条件编译用告诉编译器,某些代码不用编译,经常使用它来避免重复编译:
// common.h #ifndef COMMON_H #define COMMON_H class Circle { public: string r; }; #endif
场景是多处包含common.h文件,#ifndef避免编译器对common.h进行多次编译
3.文件包含
#include
- 一次只能引入一个文件
- <stdio.h>和"common.h"的不同点是<>只在标准库里面查找,common.h除了在标准库查找外,还在用户指定的PATH路径进行查找编译
4.宏定义的两个用户
//1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif //2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */
参考资料:
http://www.360doc.com/content/08/0324/11/59579_1140684.shtml
http://www.360doc.com/content/09/1009/16/59579_7027058.shtml