2017-01-03 2 views
1

Следующая test.c может быть успешно скомпилирован с помощью gcc компилятора:Почему один и тот же код может быть скомпилирован с помощью gcc, а не g ++?

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

В C "Сложные типы - условная функция, реализация которой не требуется, см. Раздел 6.10.8.3.)", Возможно, компилятор C++ не имеет поддержки 'complex' или какой-либо опции компиляции? – chux

+0

@perreal: По-прежнему такая же ошибка. –

+0

C++ имеет сложный тип, встроенный в класс std. Компилятор г ++ думает, что вы используете, что один, который вы бы объявить так: 'зЬй :: комплекс my_complex (1,1);' – bruceg

ответ

3

Основная причина в том, что C и C++ поддерживать сложные номера принципиально разными способами, которые несовместимы с кодом. Таким образом, C-код, который использует сложные переменные и операции над ними, не может использоваться в любой версии C++ и наоборот.

В C++ (все версии) комплексная арифметика поддерживаются шаблонным классом с именем complex, который определен в заголовке <complex> и находится в пространстве имен std. Так как это С ++ (шаблонный) класс в namespace std, что С не поддерживает вообще, этот тип и C++ заголовок <complex> не может быть использована в C.

Standard C, до 1999 года, не поддерживают сложные переменные или арифметические , В C (с 1999 года) сложная арифметика поддерживается с использованием ключевого слова _Complex и макроса удобства complex (#define d в <complex.h>), который его использует. C++ не поддерживает ключевое слово _Complex или <complex.h>.

+0

Обратите внимание, что g ++ поддерживает '_Complex' для совместимости с C, если вы переименовываете' complex' в '_Complex', пример компилируется.Однако макрос 'complex' отключен, потому что он сломает действительный код C++. –

3
$ cat test.cpp 
#include <complex> 

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

В C++, сложный шаблон, вот ссылка std::complex.

+2

Я предполагаю, что это должно быть 'std :: complex'? – gkso