Какая разница между gcc и g++/gcc-С++?

Мне кажется, что gcc может работать как с c, так и с С++-проектами, поэтому зачем нужен g++/gcc-С++?

В чем разница между g++ и gcc-С++?

Ответ 1

gcc будет компилировать исходные файлы C как исходные C и С++ исходные файлы как С++, если файл имеет соответствующее расширение; однако он не будет автоматически связываться в библиотеке С++.

g++ будет автоматически включать библиотеку С++; по умолчанию он также будет компилировать файлы с расширениями, которые указывают, что они являются источником C как С++, а не как C.

Из http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b:

Исходные файлы С++ обычно используют один из суффиксов .C, .cc, .cpp, .cpp, .c++, .cp или .cxx; Файлы заголовков С++ часто используют .hh, .hpp, .H или (для общего кода шаблона) .tcc; и предварительно обработанные файлы С++ используют суффикс .ii. GCC распознает файлы с этими именами и компилирует их как программы на С++, даже если вы вызываете компилятор так же, как для компиляции программ на C (обычно с именем gcc).

Однако использование gcc не добавляет библиотеку С++. g++ - это программа, которая вызывает GCC и обрабатывает файлы .C, .H и .i как исходные файлы С++ вместо исходных файлов C, если не используется значение -x, и автоматически указывает ссылку на библиотеку С++. Эта программа также полезна при предварительной компиляции файла заголовка C с расширением .H для использования в компиляциях С++.

Например, для компиляции простой программы на С++, которая записывается в поток std::cout, я могу использовать либо (MinGW в Windows):

  • g++ -o test.exe test.cpp
  • gcc -o test.exe test.cpp -lstdС++

Но если я попробую:

  • gcc -o test.exe test.cpp

Я получаю ссылки undefined во время ссылки.

И для другой разницы следующая программа C:

#include <stdlib.h>
#include <stdio.h>

int main() 
{
    int* new;
    int* p = malloc(sizeof(int));

    *p = 42;
    new = p;

    printf("The answer: %d\n", *new);

    return 0;
}

скомпилируется и работает с использованием:

  • gcc -o test.exe test.c

Но дает несколько ошибок при компиляции с использованием:

  • g++ -o test.exe test.c

Ошибки:

test.c: In function 'int main()':
test.c:6:10: error: expected unqualified-id before 'new'
test.c:6:10: error: expected initializer before 'new'
test.c:7:32: error: invalid conversion from 'void*' to 'int*'
test.c:10:9: error: expected type-specifier before '=' token
test.c:10:11: error: lvalue required as left operand of assignment
test.c:12:36: error: expected type-specifier before ')' token

Ответ 2

Насколько я знаю, g++ использует правильные варианты компоновщика С++, тогда как gcc использует параметры компоновщика C (чтобы вы могли получить ссылки undefined и т.д.).