web-dev-qa-db-fra.com

Forcer GCC à compiler le fichier .CPP comme c

J'ai un fichier .CPP fourni à l'extérieur. C'est un mélange de code compatible C et un peu de C++. Le code C++ n'est qu'une enveloppe autour du C pour tirer parti des fonctionnalités C++.

Il utilise #ifdef __cplusplus Macros pour protéger le code C++, ce qui est génial. Malheureusement, si j'essaie de compiler à l'aide de GCC, il le traite comme C++ en raison de la fin du fichier. Je suis au courant des différences entre GCC et G ++ - je ne veux pas compiler comme C++.

Est-ce que je peux forcer GCC à traiter ce fichier en tant que fichier C? J'ai essayé d'utiliser par exemple. --std=c99, mais cela produit correctement l'erreur que C99 n'est pas valide pour C++.

Renommer le fichier à .c fonctionne, mais j'aimerais éviter cela si possible, car il est fourni de manière externe et ce serait bien qu'il reste comme une copie vierge.

Merci!

37
ralight

Les -x L'option de GCC vous permet de spécifier la langue de tous les fichiers d'entrée en suivant:

$ gcc -x c your-file-name.cpp

Si vous ne voulez que spécialement cas qu'un fichier, vous pouvez utiliser -x none Pour éteindre le traitement spécial:

$ gcc -x c your-filename.cpp -x none other-file-name.cpp

(your-filename.cpp sera compilé comme c, tandis que other-file-name.cpp utilisera l'extension et compilera comme C++)

60
Michael Mrozek

Pour compiler FOO.CPP En tant que fichier C, vous pouvez créer un nouveau fichier nommé FOO.C et mettre les suivants comme tout son contenu:

#include "foo.cpp"

Maintenant compilez FOO.C au lieu de FOO.CPP.

Nous avons utilisé cela pour aller dans l'autre sens (compiler a -. C fichier comme C++) afin de commencer à utiliser les fonctionnalités C++ dans certains fichiers tout en préservant l'historique des CVS de leur décennie. En outre, nous construisons en utilisant le compilateur natif de chaque plate-forme, pas seulement GCC, nous n'avions donc pas à trouver le -x Commande équivalente pour une demi-douzaine de compilateurs, puis rendre notre système de construction appliquer cette commande uniquement à certains fichiers.

12
Rob Kennedy