使用枚举的C宏

时间:2018-06-29 15:24:06

标签: c enums macros

我试图通过定义调用正确代码的操作类型来使用#if宏,所以我做了一个非常简单的示例,类似于我正在尝试的操作:

#include <stdio.h>

enum{ADD,SUB,MUL};

#define operation   ADD

int main()
{
   int a = 4;
   int b = 2;
   int c;

   #if (operation == ADD)
      c = a+b;
   #endif

   #if (operation == SUB)
      c = a-b;
   #endif

   #if (operation == MUL)
      c = a*b;
   #endif


   printf("result = %i",c);
   return 0;
}

但是不幸的是,这行不通,我得到以下result = 8 ...如果我用数字替换该操作,它就可以正常工作...。但是我希望它能够如上所述工作。

任何帮助

5 个答案:

答案 0 :(得分:5)

预处理器是在某种程度上(实际)在实际的编译器看到代码之前完成的步骤。因此,它对枚举及其值一无所知,因为它们是在预处理之后发生的编译期间设置的。

您根本无法通过枚举使用预处理器条件编译。

答案 1 :(得分:4)

预处理器将始终将其视为假:

#if IDENT == IDENT

它只能测试数字值。

简化您的代码并将其提供给预处理器:

enum {ADD,SUB,MUL};

#define operation   ADD

int main()
{
    (operation == ADD);  
}

预处理器输出的结果是:

enum {ADD,SUB,MUL};
int main()
{
    (ADD == ADD);    
}

如您所见,枚举值尚未评估。在#if语句中,该表达式仅被视为 false

一种解决方法是将您的枚举替换为一系列#define

#define ADD 1
#define SUB 2
#define MUL 3

像这样工作。现在,预处理器输出的输出为:

int main()
{
   int a = 4;
   int b = 2;
   int c;


      c = a+b;
# 28 "test.c"
   printf("result = %i",c);
   return 0;
}

解决方案是:

  • 两者都依赖预处理器(如上述解决方案所示)
  • 或100%依赖编译器(使用枚举和真实的if语句)

答案 2 :(得分:1)

正如其他人所说,在enum值已知之前,预处理器会在编译的早期阶段执行其转换。因此,您无法在#if中进行此测试。

但是,您只能使用普通的if语句。任何启用了优化的不错的编译器都将检测到您正在比较常量,在编译时执行测试,并丢弃将永远不会执行的代码。因此,您将获得与#if相同的结果。

答案 3 :(得分:0)

  

但是我希望它能够如上所述工作。

您似乎是想让预处理器这样识别枚举常量,并以此来评估==表达式。恐怕你不走运。

预处理器对枚举一无所知。它在原始的令牌和空白流上运行。当它评估一个指令时,例如

#if (operation == SUB)

它首先执行宏扩展以产生

#if (ADD == SUB)

。然后,它必须以某种方式将标记ADDSUB转换为数字,但同样,它对枚举或前面代码的C含义一无所知。其将此类符号解释为数字的规则很简单:将每个符号替换为0。结果是,代码中的所有三个预处理器条件将始终取值为true。

如果要预处理器执行此操作,则需要定义预处理器的符号。由于没有使用枚举,因此最好将其全部替换为

#define ADD 1
#define SUB 2
#define MUL 3

如果您也想要枚举,则只需在预处理器中使用与枚举常量不同的符号即可。您可以根据自己的喜好使用相同或不同的值,因为永远不会见面。

答案 4 :(得分:0)

另一种解决方案是将枚举包含在包含的头文件中。