【问题标题】:Why can the same code be compiled successfully through gcc while not g++?为什么相同的代码可以通过gcc编译成功,而g++不行?
【发布时间】:2017-01-03 05:21:39
【问题描述】:

使用gcc编译器可以成功编译以下test.c

$ cat test.c
#include <complex.h>

int main(void) {
    double complex a = 0;
    return 0;
}
$ gcc -o test1 test.c
$

改名test.cpp后,用g++编译器编译,出现错误:

$ cat test.cpp
#include <complex.h>

int main(void) {
    double complex a = 0;
    return 0;
}

$ g++ -o test2 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4:20: error: expected initializer before ‘a’
     double complex a = 0;
                    ^

为什么同样的代码通过gcc可以编译成功,而g++不行?

附:我的编译器版本:

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 6.2.1 20160830 (GCC)
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 6.2.1 20160830 (GCC)

【问题讨论】:

  • 在 C 中“复杂类型是实现不需要支持的条件特性;参见 6.10.8.3。)”,也许 C++ 编译器缺少 complex 支持或需要一些编译选项?
  • @perreal: 还是一样的错误。
  • 头文件 不包含来自 C 标准库的任何内容,而仅包含来自 C 标准库的其他头文件C++ 标准库。在 C++ 中不推荐使用所有这些标头。
  • 这是另一个例子,说明 C 不是 C++ 的子集。不要期望任何适用于 C 的东西都适用于 C++
  • 因为 C 不是 C++ 的子集。

标签: c++ c gcc compiler-errors g++


【解决方案1】:

基本原因是 C 和 C++ 以根本不同的方式支持复数,这是代码不兼容的。因此,使用复杂变量及其操作的 C 代码不能在任何版本的 C++ 中使用,反之亦然。

在 C++(所有版本)中,复杂算术由名为 complex 的模板类支持,该类在标题 &lt;complex&gt; 中定义,位于命名空间 std 中。由于是namespace std中的C++(模板化)类,C完全不支持,所以C中不能使用这种类型和C++头&lt;complex&gt;

1999 年之前的标准 C 不支持复变量或算术。在 C 中(自 1999 年以来),使用 _Complex 关键字和使用它的便利宏 complex#defined in &lt;complex.h&gt;)支持复杂算术。 C++ 不支持_Complex 关键字或&lt;complex.h&gt;

【讨论】:

  • 请注意,g++ 确实支持 _Complex 以与 C 兼容,如果您将 complex 重命名为 _Complex,则示例编译。但是,宏 complex 被禁用,因为它会破坏有效的 C++ 代码。
【解决方案2】:
$ cat test.cpp
#include <complex>

int main(void) {
    std::complex<double> a = 0;
    return 0;
}

在 C++ 中,complex 是一个模板,这里是参考std::complex

【讨论】:

  • 我猜应该是std::complex?
【解决方案3】:

对于 C++ 复杂类型:http://en.cppreference.com/w/cpp/numeric/complex

对于C复杂类型:How to work with complex numbers in C?

Complex.h 在 C 和 C++ 中的工作方式不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2019-11-15
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多