#define与const的区别
定义内容不同
#define N 10 //称为明示常量 宏常量
const int n = 10; //const定义的常量,其实不是真正的常量,const修饰的变量表示只读
int main(){
int arr[N] = {};
//int brr[n] = {}; //error
int brr[n];
static int crr[N];
static int drr[n]; //error
const int x = 3*4*5;
int a = 4,b = 5;
const int y = a*b;
return 0;
}
-
编译器处理方式也不一样
-
宏,是在预处理阶段进行替换
-
const变量是在编译或者运行时进行赋值or计算
-
-
存储方式也不一样
-
宏,不是为其分配内存的 ,在代码中使用宏的地方直接替换成值
-
每使用一次宏,都是替换一次
-
-
const变量,在运行时一定会为其分配相应的内存空间
-
每使用一次变量,都是从内存中加载一次该变量的数据
-
-
-
执行效率也不一样
-
宏直接替换之后,是用值代替了,不涉及到取值操作
-
const变量,在进行处理时,从内存中加载
-
#define 与 typedef的区别
typedef 给类型取别名
typedef unsigned long int size_t; //size_t 就是 unsigned long int类型
#define size_t unsigned long int //size_t 是新的标识符 使用size_t地方会被替换成unsigned long int
typedef int * TP;
#define DP int *
TP a,b; // TP == int * a,b都是int*类型
DP m,n; // 直接替换 int * m,n; m是int*类型 n是int类型
unsigned DP p1; //正确的 unsigned int * p1;
unsigned TP p2; //错误的
#undef #line #error #warning
-
#undef 删除一个已经定义过的宏
-
#line指定行号
-
#error 预处理错误,直接中断
#warning 预处理产生警告
条件编译
条件编译,是指在编译预处理时,选择性的编译部分代码,满足条件的代码就编译,不满足条件的代码直接删除,与分支语句不同,分支语句中,每一个分支都能够确保会编译到可执行文件中,至于会不会执行,另说
if(1){
printf("hello\n");
} else {
printf("world!\n"); //这句代码永远也无法执行 但是它会编译到可执行文件中
}
根据宏定义来判断
//如果宏已经定义过,则编译此部分代码
#ifdef MACRO
//这部分代码 MACRO宏如果定义了 会编译 否则删除
#endif
//如果宏没有定义过,则编译此部分代码
#ifndef MACRO
//MACRO这个宏如果没有定义则编译
#endif
//二者中选其中一种方式就可以
可以根据宏的值来进行条件编译,但只能是一些简单的条件判断(在预处理能够处理的)
#if MACRO == 1
#elif MACRO == 2
#elif MACRO == 3
[#else]
#endif