C++ 它是如何工作的?我是否误解了#if~#endif的形式?

C++ 它是如何工作的?我是否误解了#if~#endif的形式?,c++,C++,到 我把它改成了类似的形式 然后 上面的代码是我想要的 但是我想用国名而不是数字。 我是否误解了(#if ~#endif)的工作原理?在#if中,只能使用已用#define初始化的值。这应该如预期的那样起作用: typedef int LOCAL; LOCAL KOREA = 82; LOCAL JAPAN = 81; LOCAL CHINA = 86; LOCAL USER_LOCAL = 86; #if (USER_LOCAL == 82 || USER_LOCAL == 81) type

我把它改成了类似的形式

然后

上面的代码是我想要的

但是我想用国名而不是数字。 我是否误解了(#if ~#endif)的工作原理?

#if
中,只能使用已用
#define
初始化的值。这应该如预期的那样起作用:

typedef int LOCAL;
LOCAL KOREA = 82;
LOCAL JAPAN = 81;
LOCAL CHINA = 86;
LOCAL USER_LOCAL = 86;

#if (USER_LOCAL == 82 || USER_LOCAL == 81)
typedef char NAME[20];
#elif (USER_LOCAL == 86)
typedef char NAME[5];
#endif

如果您在问题中出错,请更新问题,而不是添加评论。最好在任何人发布答案之前这样做。@jamesdlin:他们的行为并不完全相同。在第一个代码中,
USER_LOCAL==KOREA
将计算为非零,因为两者都没有明确定义,因此都默认为
0
(因此,
NAME
将定义为
char[20]
)。在第二个代码中,
#if
#elif
条件的计算结果均为零,因为没有明确定义
USER\u LOCAL
,因此不能等于任何提供的值(因此,
NAME
将未定义)。但这与op的观察结果不符,这并不完全正确。如果您有
#If ransess
并且从不定义
ransess
,则预处理器将
ransess
解释为零(在这种情况下,如果存在
else
子句,则执行
#elif
子句)。这就是为什么原始测试
#if(USER_LOCAL==KOREA | | USER_LOCAL==JAPAN)
的计算结果为“true”;
USER\u LOCAL
KOREA
JAPAN
都未定义,因此它们都被视为零,因此条件为真。此外(很抱歉太迂腐了),但预处理器也知道一些符号从未有相应的
\define
(例如,
\uuu文件
\uu行
)。大多数C编译器还支持通过命令行参数定义简单的预处理器宏。
LOCAL USER_LOCAL = CHINA;
LOCAL USER_LOCAL = 86;
typedef int LOCAL;
LOCAL KOREA = 82;
LOCAL JAPAN = 81;
LOCAL CHINA = 86;
LOCAL USER_LOCAL = 86;

#if (USER_LOCAL == 82 || USER_LOCAL == 81)
typedef char NAME[20];
#elif (USER_LOCAL == 86)
typedef char NAME[5];
#endif
#define JAPAN 81
#define KOREA 82
#define CHINA 86
#define USER_LOCAL CHINA

#if (USER_LOCAL == KOREA || USER_LOCAL == JAPAN)
typedef char NAME[20];
#elif (USER_LOCAL == CHINA)
typedef char NAME[5];
#endif