为什么文件扩展名对编译有影响?
我在 CentOs8 下用 GNU 编译器编译这段代码:
#include <stdlib.h>
int main() {
int *a = malloc(3 * sizeof(int));
return 0;
}
当我将它命名为a.cpp 时,两个编译命令都失败了:
g++ -o a a.cpp
gcc -o a a.cpp
但是在我将其重命名为ac 后,此编译命令成功:
gcc -o a a.c
这是 C 代码,而不是 C++ 代码。我相信使用gcc或g++应该有所作为,但似乎编译器只考虑文件扩展名。
你能提供一些关于这方面的细节吗?
回答
C++ 将在您从tovoid*返回的隐式转换中出错。而 C 允许隐式转换为其他指针类型。malloc()int*void*
大多数编译器将默认查看文件扩展名以确定要编译的语言。
Aman gcc显示所有.c文件默认编译为C. 而所有.cc, .cp, .cxx, .cpp, .CPP,.c++和.C(大写 C)文件都编译为C++.
您可以通过-xgcc/g++ 选项覆盖此行为强制语言。
例子:
gcc -x c++ foo.c -c // compiles foo.c as C++ instead of C
gcc 和 g++ 在大多数 unix 系统上通常是相同的二进制文件。它只是根据自己的argv[0]参数默认为不同的行为。
显式使用 g++ 和 gcc 与-x选项之间可能存在其他行为差异。我不确定。