我试图通过定义调用正确代码的操作类型来使用#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
...如果我用数字替换该操作,它就可以正常工作...。但是我希望它能够如上所述工作。
任何帮助
答案 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;
}
解决方案是:
if
语句)答案 2 :(得分:1)
正如其他人所说,在enum
值已知之前,预处理器会在编译的早期阶段执行其转换。因此,您无法在#if
中进行此测试。
但是,您只能使用普通的if
语句。任何启用了优化的不错的编译器都将检测到您正在比较常量,在编译时执行测试,并丢弃将永远不会执行的代码。因此,您将获得与#if
相同的结果。
答案 3 :(得分:0)
但是我希望它能够如上所述工作。
您似乎是想让预处理器这样识别枚举常量,并以此来评估==
表达式。恐怕你不走运。
预处理器对枚举一无所知。它在原始的令牌和空白流上运行。当它评估一个指令时,例如
#if (operation == SUB)
它首先执行宏扩展以产生
#if (ADD == SUB)
。然后,它必须以某种方式将标记ADD
和SUB
转换为数字,但同样,它对枚举或前面代码的C含义一无所知。其将此类符号解释为数字的规则很简单:将每个符号替换为0。结果是,代码中的所有三个预处理器条件将始终取值为true。
如果要预处理器执行此操作,则需要定义预处理器的符号。由于没有使用枚举,因此最好将其全部替换为
#define ADD 1
#define SUB 2
#define MUL 3
如果您也想要枚举,则只需在预处理器中使用与枚举常量不同的符号即可。您可以根据自己的喜好使用相同或不同的值,因为永远不会见面。
答案 4 :(得分:0)
另一种解决方案是将枚举包含在包含的头文件中。