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

时间:2017-01-03 05:21:39

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

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

$ 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++

P.S。我的编译器版本:

$ 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)

3 个答案:

答案 0 :(得分:3)

$ cat test.cpp
#include <complex>

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

在C ++中,complex是一个模板,这里是引用std::complex

答案 1 :(得分:3)

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

在C ++(所有版本)中,复杂算术由名为complex的模板化类支持,该类在标头<complex>中定义,并在名称空间std中。由于它是namespace std中的C ++(模板化)类,C根本不支持,因此不能在C中使用此类型和C ++标头<complex>

标准C,在1999年之前,不支持复杂变量或算术。在C(自1999年以来)中,使用_Complex关键字和使用它的方便宏complex#define d <complex.h>)支持复杂算术。 C ++不支持_Complex关键字或<complex.h>

答案 2 :(得分:1)

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

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

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