Il me semble que gcc peut gérer à la fois les projets c et c ++, alors pourquoi g ++/gcc-c ++ est-il nécessaire?
Quelle est la différence entre g ++ et gcc-c ++?
gcc
compilera les fichiers source C en tant que fichiers source C et C++ en C++ si le fichier a une extension appropriée; cependant, il ne sera pas automatiquement lié dans la bibliothèque C++.
g++
inclura automatiquement la bibliothèque C++; par défaut, il compilera également les fichiers avec des extensions qui indiquent qu'ils sont source C en C++, au lieu de C.
De http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b :
Les fichiers source C++ utilisent classiquement l'un des suffixes
.C
,.cc
,.cpp
,.CPP
,.c++
,.cp
, ou.cxx
; Les fichiers d'en-tête C++ utilisent souvent.hh
,.hpp
,.H
, ou (pour le code de modèle partagé).tcc
; et les fichiers C++ prétraités utilisent le suffixe.ii
. GCC reconnaît les fichiers portant ces noms et les compile en tant que programmes C++ même si vous appelez le compilateur de la même manière que pour la compilation de programmes C (généralement avec le nom gcc).Cependant, l'utilisation de gcc n'ajoute pas la bibliothèque C++. g ++ est un programme qui appelle GCC et traite
.c
,.h
et.i
fichiers en tant que fichiers source C++ au lieu de fichiers source C, sauf si -x est utilisé, et spécifie automatiquement la liaison avec la bibliothèque C++. Ce programme est également utile lors de la précompilation d'un fichier d'en-tête C avec un.h
extension à utiliser dans les compilations C++.
Par exemple, pour compiler un programme C++ simple qui écrit dans le std::cout
stream, je peux utiliser soit (MinGW sous Windows):
Mais si j'essaye:
J'obtiens des références non définies au moment du lien.
Et pour l'autre différence, le programme C suivant:
#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;
}
se compile et s'exécute correctement en utilisant:
Mais donne plusieurs erreurs lors de la compilation en utilisant:
Les erreurs:
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
Pour autant que je sache, g ++ utilise les bonnes options de l'éditeur de liens C++ tandis que gcc utilise les options de l'éditeur de liens C (vous pouvez donc obtenir des références non définies, etc.).