宏定义与枚举重名时,为什么宏定义在枚举之后,编译没有问题;宏定义在枚举之前编译就会报错?

宏定义与枚举重名时,为什么宏定义在枚举之后,编译没有问题;宏定义在枚举之前编译就会报错?


#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赋值吗

宏定义的数据是一个常量,在存储方式上属于不可修改的存储数据。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7570772
  • 这篇博客也不错, 你可以看下给定一个字符串,返回其通过重新排列组合后所有可能的回文字符串,并去除重复组合
  • 除此之外, 这篇博客: 指针是什么?指针怎么理解?怎么理解指针?最简单最通俗的讲解,即使不理解,记住之后也会理解代码,非常有效,希望对你有帮助!中的 下面是函数调用时的指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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;
    }
    
    
    
  • 您还可以看一下 陈槐老师的零基础新手入门软件测试必知必会课程中的 项目实战中系统编写测试用例有什么意义小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    当存在宏定义与枚举重名时,将宏定义放在枚举之后编译没有问题,而将宏定义放在枚举之前编译就会报错。

    这是因为在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;
    }
    

    通过上述代码可以看到,在将宏定义放在枚举之后时,编译可以正常通过并输出正确的结果。而将宏定义放在枚举之前时,编译会报错并提示枚举的值无法识别。因此,避免宏定义与枚举重名可以避免这个问题的出现。