gpt4 book ai didi

c++ - gcc 选项 std=gnu++17 与 std=c++17

转载 作者:行者123 更新时间:2023-12-02 02:01:53 26 4
gpt4 key购买 nike

我在使用带有 -std=gnu++17 的 g++(我试过版本 8 到 11)时遇到了编译错误,但可以使用选项 -std= 编译相同的代码c++17.

#include <complex.h>
int main()
{
int I=0;
return I;
}

使用选项 -std=gnu++17,这会导致以下错误:

error: invalid cast from type '__complex__ float' to type 'int'
5 | int I=0;

使用选项 -std=c++17 编译时没有警告和错误。

我知道在 complex.h 头文件中有一个宏定义 #define I _Complex_I。 gcc 文档说选项 -std=gnu++17 添加了相应 c++ 标准的 GNU 方言。尽管如此,我还是不明白为什么这会导致上述程序的编译出现差异。

背景:当我开始使用添加标志 std=gnu++17 的 cmake 功能 cxx_std_17 并导致各种编译错误时,我遇到了这种行为,因为一个第三方库使用标识符I 和另一个包含 header complex.h

最佳答案

C++ 标准说:(C++17 C.6.1/3):

The C++ headers <ccomplex> (D.4.1) and <ctgmath> (D.4.4), as well as their corresponding C headers<complex.h> and <tgmath.h>, do not contain any of the content from the C standard library and insteadmerely include other headers from the C++ standard library.

所以 C 的 complex.h 不包含在 C++ 中,意思是在你的代码中 I不应定义任何内容。

当允许 GNU 扩展时,GCC 确实包含 C 内容作为扩展。参见 PR 82417 :

As an extension the C++ version of <complex.h> includes the C version,but that defines macros with non-reserved names that should not bedefined in ISO C++. Only include the C header for non-strict modes, orfor pre-C++11 (because C++98 doesn't mention <complex.h> at all).

关于c++ - gcc 选项 std=gnu++17 与 std=c++17,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68935018/

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