gcc 无法将 *.C 源代码识别为有效的 c 程序

Esm*_*elE 0 c gcc ubuntu-16.04

我不小心将.C[note to Uppercase C ] 扩展名分配给 UBUNTU 16.04 LTS 中的 C 源代码,并使用 Gedit 程序打开它以输入我的代码。

\n

gcc 编译器无法将其识别为 C 编程源代码,并在尝试编译时产生错误。

\n

UBUNTU 文件管理器将其显示为 cpp 文件。

\n

代码

\n
#include <stdlib.h>\n\nint main(){\n\n    int * c = malloc(sizeof(int));\n    free(c); \n  \n    return 0;   \n}\n
Run Code Online (Sandbox Code Playgroud)\n

gcc编译命令,输出:

\n
$gcc test.C -o test\ntest.C:8:18: error: invalid conversion from \xe2\x80\x98void*\xe2\x80\x99 to \xe2\x80\x98int*\xe2\x80\x99 [-fpermissive]\n  int * c = malloc( sizeof(int) );\n
Run Code Online (Sandbox Code Playgroud)\n

正如我们所知,这是一个 C++ 特定错误,我认为 gcc 的行为就像 C++ 文件一样,如\n 中所述。

\n

这是我的系统信息

\n
Linux ee 4.8.0-36-generic #36~16.04.1-Ubuntu SMP  i686 i686 i686 GNU/Linux\n\ngcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609\n\ngedit - Version 3.18.3\n
Run Code Online (Sandbox Code Playgroud)\n

malloc()我知道我们可以简单地转换to的返回值(int*),这显然是有效的。

\n

我们知道malloc()返回类型是void*参见linuxdiemalloc()

\n

malloc()在 C 中强制转换 type of 是不正确的,为什么不强制强制转换 return ofmalloc()

\n

UBUNTU 中的 C 源代码只有小写扩展名有效吗?为什么要这样做?

\n

以及如何解决这个问题并source.C在我的机器上使用 gcc 进行编译。

\n

编辑

\n

正如MCG在答案中所说,我们可以强制gcc将任何给定文件视为特定类型,并用标志告诉它-x

\n

例如,如果我们有一个带有 .f 扩展名的 C 有效源代码,甚至是 UBUNTU 上没有任何扩展名的源代码,通过使用此命令,它将被正确编译,

\n

编译具有任意扩展名的 C 源代码

\n
gcc -x c src.f -o src // with .f or any others\ngcc -x c src -o src  //without extension\n
Run Code Online (Sandbox Code Playgroud)\n

MCG*_*MCG 5

GCC 将.C(大写字母)扩展名识别为 C++ 文件。您需要将文件的扩展名更改为.c(小写字母)。另外,您正确地提到并引用了 C++ 在 malloc 的情况下需要强制转换,而在 c 中,存在从任何对象指针类型到 void * 的隐式转换。

请参阅下面GCC 文档中有关文件扩展名 (.C和) 的说明。.c请参阅下面的 GCC 链接以获取各种文件扩展名的详细说明。

文件.C

必须预处理的 C++ 源代码。请注意,在 .cxx 中,最后两个字母必须都是字面意义上的 x。同样,.C 指的是字面大写的 C。

文件.c

必须进行预处理的 C 源代码。

https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Overall-Options.html

此外,您可以提供标志-x c以强制 GCC 将文件视为 C,而不是 C++。