宏定义与枚举重名时,为什么宏定义在枚举之后,编译没有问题;宏定义在枚举之前编译就会报错?
#include <stdio.h>
#define TEST_A 1
typedef enum
{
TEST_A = 0,
TEST_B
}test;
int main()
{
printf("TEST_A :%d\r\n", TEST_A);
return 0;
}
本来就是这样,宏定义管它定义之下,并且可以多次定义
#include <stdlib.h>
int main()
{
#define A 1
printf("%d\n", A);
#define A 2
printf("%d\n", A);
return(0);
}
这段代码输出
1
2
因为你的枚举里面用到了TEST_A
如果宏定义在后,宏定义会覆盖掉枚举定义,后面相当于打印1
而宏定义在前,你的代码等于写了个1=0,能给1赋值吗
宏定义的数据是一个常量,在存储方式上属于不可修改的存储数据。
void f (int * p)//这里上面说过了,变量名是i,但是类型是int *,可以保存其他变量的地址。
{
*p=100;//上面也说过,*p就是i,i就是*p
}
int main()
{
int i=9;//这是一个普通的定义和赋值
f(&i);//这里要是调用函数,用&i,把i的地址传递给函数的参数p
cout<<"i"<<i;//结果应该是100
return 0;
}
当存在宏定义与枚举重名时,将宏定义放在枚举之后编译没有问题,而将宏定义放在枚举之前编译就会报错。
这是因为在C语言中,预处理器会在编译之前对代码进行预处理,其中包括宏替换操作。宏定义是通过预处理器进行替换的,而枚举是在编译阶段进行处理的。
当宏定义与枚举重名时,如果宏定义放在枚举之后,预处理器会先对宏进行替换,然后编译器才会处理枚举。因此,编译器在处理枚举时不会受到宏定义的影响,编译可以正常通过。
而如果宏定义放在枚举之前,预处理器在进行宏替换的时候就会将枚举的值替换为宏定义的值,这样在编译阶段就会出现错误。因为编译器在处理枚举时需要使用枚举的值,而此时枚举的值已经被宏定义替换掉了。
解决这个问题的方法就是避免宏定义与枚举重名,尽量不要在代码中使用同名的宏定义和枚举。如果确实需要使用相同的名称,可以修改其中一个的名称来避免冲突。
以下是一个示例代码来说明这个问题:
#include <stdio.h>
// 定义一个宏定义
#define STATUS_OK 0
// 定义一个枚举
enum Status {
STAT_OK = 1,
STAT_ERROR = 2
};
int main() {
// 在枚举之后使用宏定义,编译可以通过
printf("宏定义:%d\n", STATUS_OK);
printf("枚举:%d\n", STAT_OK);
// 在枚举之前使用宏定义,编译会报错
//printf("枚举:%d\n", STAT_OK);
//printf("宏定义:%d\n", STATUS_OK);
return 0;
}
通过上述代码可以看到,在将宏定义放在枚举之后时,编译可以正常通过并输出正确的结果。而将宏定义放在枚举之前时,编译会报错并提示枚举的值无法识别。因此,避免宏定义与枚举重名可以避免这个问题的出现。