使用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)
答案 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 ++中的工作方式不同