使用枚举的C宏

A.S*_*SDR 2 c macros enums

我试图通过定义调用正确代码的操作类型来使用#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;
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这不起作用我得到以下result = 8...如果我用数字替换操作它工作正常....但我希望它工作,如上所述.

任何帮助

Som*_*ude 5

预处理器是在某种程度上在实际编译器看到代码之前完成的步骤.因此,它不知道枚举或它们的值,因为它们是在编译期间设置的,它们在预处理之后发生.

您根本无法使用枚举来使用预处理器条件编译.


Jea*_*bre 5

预处理器将始终认为这是错误的:

#if IDENT == IDENT
Run Code Online (Sandbox Code Playgroud)

它只能测试数值。

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

enum {ADD,SUB,MUL};

#define operation   ADD

int main()
{
    (operation == ADD);  
}
Run Code Online (Sandbox Code Playgroud)

预处理器输出的结果是:

enum {ADD,SUB,MUL};
int main()
{
    (ADD == ADD);    
}
Run Code Online (Sandbox Code Playgroud)

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

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

#define ADD 1
#define SUB 2
#define MUL 3
Run Code Online (Sandbox Code Playgroud)

像这样它有效。预处理器输出现在为:

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


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

解决办法是:

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