gpt4 book ai didi

c++ - 预处理器宏作为其他宏的参数

转载 作者:IT老高 更新时间:2023-10-28 23:17:31 26 4
gpt4 key购买 nike

以下 C++ 代码编译并作为程序员在 GCC (4.0.4) 上运行

#define FOO(x,y,z) ((x)*(y)*(z))
#define BAR(x) FOO(x,1)
#define BAZ 3,7

int main()
{
return BAR(BAZ); /* interpreted as return ((3)*(7)*(1)); */
}

但是,宏在 Microsoft Visual C++ Express 2010 上会导致错误:

main.cpp(7): warning C4003: not enough actual parameters for macro 'FOO'
main.cpp(7): error C2059: syntax error : ')'

问题似乎在于,Microsoft 编译器在内部处理 BAR 宏时,并未将 BAZ 宏扩展为可用作宏 FOO 的两个单独参数的参数。

按照标准,哪个编译器能正确处理这种情况?

最佳答案

根据 ISO/IEC 14882:2003 (C++ Stardard) 16.3.4 的宏扩展执行如下:

  1. 宏调用被宏的替换列表(主体)替换,其中每个参数名称(除非它受 # 或 ## 影响)被宏调用中指定的相应参数的完整宏扩展替换。
  2. 第 1 步的结果被重新扫描。如果其中有更多的宏调用(除了那些已经扩展并考虑文本的),它们会根据相同的过程递归地扩展。

您指定的代码的步骤顺序是:

  1. BAR(BAZ)
  2. FOO(3,7,1)
  3. ((3)*(7)*(1))

所以 GCC 是对的,而 VC 不是。但是 VC 提示的错误是 FOO 有 3 个参数,而 BAR 只指定了其中的 2 个。 VC 显然试图尽快捕获错误,但做得有点过头了。

关于c++ - 预处理器宏作为其他宏的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684169/

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