我试图通过定义调用正确代码的操作类型来使用#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...如果我用数字替换操作它工作正常....但我希望它工作,如上所述.
任何帮助
预处理器是在某种程度上在实际编译器看到代码之前完成的步骤.因此,它不知道枚举或它们的值,因为它们是在编译期间设置的,它们在预处理之后发生.
您根本无法使用枚举来使用预处理器条件编译.
预处理器将始终认为这是错误的:
#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)
解决办法是:
if语句)