GCC 编译器可识别 C 语言方言和 C++ 语言方言,并生成相应的代码。根据 GCC 规范,在源文件上 GCC 编译器或 G++ 编译器均可等效使用。根据您所使用的编译器以及源文件的扩展名来判定输入和输出文件上使用的方言。
使用 GCC 编译器时,程序的方言始终根据文件扩展名来判定,如 文件类型和扩展名 中所示。如果文件扩展名显示此文件为 C++ 源文件,则语言设为 C++。这表示如果 CC 文件中包含编译 C 语言代码,那么即使您使用的是 GCC 编译器,它也会自动重整函数名称。
GCC 与 G++ 之间的主要差异在于 G++ 会将默认语言方言自动设置为 C++(与文件扩展名无关),并在链接时在 C++ 支持库中自动拉取。这意味着即使您在 .c 文件中使用 G++ 编译器来编译 C 语言代码,它仍会重整名称。
名称重整是 C++ 和支持符号重载的其他语言所特有的概念。当某个函数可以基于传入的实参执行不同操作并且可以返回不同的返回值时,即可将该函数称为重载函数。为支持此概念,C++ 编译器在函数名称内对要调用的函数类型进行编码,以避免带有相同名称的函数包含多个定义。
如要采用混合编译模式,请谨慎处理名称重整,在此模式下某些源文件包含 C 语言代码,其他源文件则包含 C++ 代码(或者某些文件使用 GCC 来编译,其他文件则使用 G++ 来编译)。为防止 C 语言符号发生名称重整,您可在符号声明中使用以下构造。
#ifdef __cplusplus
extern “C” {
£endif
int foo();
int morefoo();
#ifdef __cplusplus
}
#endif
请将这些声明包含在头文件中,并在所有源文件中使用。这样就会导致编译器在编译这些符号的定义或者引用时,使用 C 语言方言。
使用编译器的任意变体执行编译时,可使用 -x lang 开关来强制文件使用某一特定方言。如需了解有关此开关的更多信息,请参阅 GCC 文档。
- 使用 GCC 编译器时,不会自动链入 libstdc++.a 和 libsupc++.a。
- 编译 C++ 程序时,请使用编译器的 G++ 变体,确保所有必要的支持库都能自动链入。
- 您还可以向 GCC 命令添加
-lstdc++
和-lsupc++
选项。
如需了解有关如何为不同语言调用编译器的更多信息,请参阅 GNU 在线文档。