#ifdef WIN32 #elif WIN64 #endif

7

我看到了一个示例代码,链接在这里

#ifdef WIN32
   ...
#elif WIN64
   ...
#endif

在一个`#ifdef`块中,使用`#elif`表示`#elif defined`是否合法?
1个回答

10
不应该这样,这并不意味着一些晦涩的C编译器会把它当作这样的方式接受,但它不是C标准的一部分。
通常情况下,对于这种情况,你可以使用#elifdef FOO(我从未在生产代码中见过),或者#elif defined(FOO)(就像你提到的那样)。
这段代码似乎以一种奇怪的方式工作;它首先检查WIN32是否已定义,然后检查WIN64是否非零。

感谢澄清。然而,似乎Visual Studio资源编辑器不喜欢这两种解决方法,只需要使用没有参数的 #elif - Felix Dombek
有趣。也许Visual Studio的.rc文件有它们自己(完全不同的)语法。 - The name's Bob. MS Bob.
假设WINxx被定义为1,这段代码并不严格错误,只是有点奇怪(可能不是他们想要的)。请记住,在表达式中未定义的名称会扩展为0,因此这是不合法的类型,但是有效的逻辑。 - Alex Celeste
这是一个很好的观点,但这假设 #define WINxx 1,而不是 #define WINxx - The name's Bob. MS Bob.
@Leushenko 这个假设是不成立的,因为据我所知,你只能在项目设置中定义依赖于设置的符号,但不能给这些符号赋特定的值。 - Felix Dombek
让我重新表述一下:上面的代码片段本身并不是严格无效的,只是不一致,因为常量可以被定义为1,在特定情况下它会起作用。虽然这是一个坏主意,但原始作者可能仍然假设这是正确的。(也有可能常量被记录为定义为1或根本不定义,在这种情况下,这是一个经过公司批准的坏主意。) - Alex Celeste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接