gpt4 book ai didi

c++ - 在 C89 和 C++ 中用空参数调用宏真的是未定义的行为吗?

转载 作者:太空狗 更新时间:2023-10-29 20:02:55 33 4
gpt4 key购买 nike

考虑以下程序:

#include <iostream>
#define add(s,m,a) ( s + m + a + 0 )
int main()
{
std::cout<<add(3,4,5)<<'\n';
std::cout<<add(15,30,)<<'\n';
std::cout<<add(10, , 33)<<'\n';
std::cout<<add(10,,)<<'\n';
std::cout<<add(,,)<<'\n';
}

我的编译器 gcc 4.8.1 给出以下警告:

6   23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

7 25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8 21 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8 21 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9 19 [Warning] invoking macro add argument 1: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9 19 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9 19 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

我知道 C++ 不支持空预处理器函数宏参数。但是 C99 允许使用空(缺失)参数指定预处理器函数宏。

(此功能很可能作为许多 C++ 编译器的扩展提供,例如上述情况中的 g++)。根据 C89 和 C++ 标准,程序的行为确实未定义吗?

最佳答案

C89/C90 和 C++98 标准根本没有定义应该如何处理空宏参数。因此,行为因疏忽而未定义,预处理时警告或错误消息是合理的结果。

如您所述,C99 是第一个允许它的 C 标准,但同样值得一提的是 C++11 采用了 C99 措辞。所以不,在 C++ 中拥有空的宏参数不再是未定义的行为。

关于c++ - 在 C89 和 C++ 中用空参数调用宏真的是未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332819/

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