gpt4 book ai didi

Microsoft Visual Studio 2010 中的 C 预处理器问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:20 25 4
gpt4 key购买 nike

我在 VS 2010 中遇到了新的 Visual C++ 问题。

我有一个包含以下定义的 header :

#define STC(y) #y
#define STR(y) STC(\y)
#define NNN(y) 0##y
#define NUM(y) NNN(y)

目的是你可以有一些常量,比如

#define TOKEN x5A

然后您可以将 token 作为数字或字符串:

NUM(TOKEN) -> 0x5A
STR(TOKEN) -> "\x5A"

这是宏参数替换规则下的预期行为,到目前为止,它在 VS2008 Express 中与 gcc、open watcom、pellesC (lcc)、Digital Mars C 和 Visual C++ 配合良好。

今天我用VS2010 Express重新编译了这个库,结果发现它不能用了!使用新版本我会得到:

NUM(TOKEN) -> 0x5A
STR(TOKEN) -> "\y"

似乎新的预处理器将 \y 视为转义序列,即使在宏体内也是如此,这是无意义的,因为转义序列仅在文字字符串中有意义。

我怀疑这是 ANSI 标准的灰色区域,但即使原始行为是标准强制要求的,MS VC++ 并不是 100% 符合 ANSI C 的著名产品,所以我想我将不得不忍受MS 编译器的新行为。

鉴于此,有人对如何使用 VS2010 重新实现原始宏行为有什么建议吗?

编辑:更正了 NUM()

编辑:可能的解决方案

我想我已经找到了一种方法:

#define STC(y) #y

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#define STA(x,y) STC(x##y)
#define STR(y) STA(\,y)
#else
#define STR(y) STC(\y)
#endif

#define NNN(y) 0##y
#define NUM(y) NNN(y)

现在我得到:

#define TOKEN x2E

NUM(TOKEN) -> 0x2E
STR(TOKEN) -> "\x2E"

当然,gcc 会提示将反斜杠加入文字 (\## x2E),因为结果不是有效的预处理器符号,但 MS 似乎很高兴,因此 #ifdef.

如果有人有更好的解决方案,我将很高兴听到!

最佳答案

您正在/曾经依赖于编译器的一些奇怪的非标准行为。

您的 NUM 宏写错了。它应该从来没有工作过,无论是在旧版本还是新版本的编译器中。当您执行 NUM(TOKEN) 时,任何符合标准的编译器中宏展开的结果将是 0TOKEN 而不是 0x5A。为了使您的 NUM 宏按预期工作,您必须以两级方式实现它:

#define NUM_(y) 0##y
#define NUM(y) NUM_(y)

到目前为止,它对您“有效”的唯一原因只是编译器中的另一个故障。

我还不确定 STR 案例发生了什么。编译器确实在提示无法识别的转义序列。一定是编译器中的错误。

关于Microsoft Visual Studio 2010 中的 C 预处理器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2851098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com