【发布时间】:2014-04-30 15:57:18
【问题描述】:
我正在研究有关预处理器的确切行为的 C++ 标准(我需要实现某种 C++ 预处理器)。据我了解,我在下面编写的示例(以帮助我理解)应该是有效的:
#define dds(x) f(x,
#define f(a,b) a+b
dds(eoe)
su)
我希望像宏调用 dds(eoe) 这样的第一个函数被 f(eoe, 替换(注意替换字符串中的逗号),然后在重新扫描输入时将其视为 f(eoe,su)。
但是 VC++2010 的测试给了我这个(我告诉 VC++ 输出预处理文件):
eoe+et_leoe+et_l
su)
这是违反直觉的,显然是不正确的。是 VC++2010 的 bug 还是我对 C++ 标准的误解?特别是,像我一样在替换字符串的末尾加上逗号是否不正确?我对 C++ 标准语法的理解是,任何preprocessing-token 都可以在此处使用。
编辑:
我没有 GCC 或其他版本的 VC++。有人可以帮我验证这些编译器。
【问题讨论】:
-
用 clang++ 运行我得到了
eoe+su -
vs2013 输出 eoe+eoe+su)
-
VC++2010 和宏调用
dds(xyz)pqr)会发生什么?然后出现+et_l材料中的任何一个吗?我在想您使用的其中一个词可能是 VC++2010 的#definedd,这可能导致“错误”扩展是正确的,尽管不是预期的。您也可以在调用dds宏之前尝试#undef eoe和#undef su,看看是否会改变输出。这是预处理器的(许多)问题之一。没有范围控制,几乎任何名称都可以由某个标头定义。
标签: c++ visual-c++ preprocessor c-preprocessor compiler-bug