gcc 无法将 *.C 源代码识别为有效的 c 程序
gcc not recognize *.C source code as valid c program
我在 UBUNTU 16.04 LTS 中不小心将 .C
[注意大写 C] 扩展名分配给了我的 C 源代码,并使用 Gedit 程序打开它以输入我的代码。
gcc 编译器无法将其识别为 C 编程源代码,并在尝试编译时产生错误。
并且 UBUNTU 文件管理器将其显示为 cpp 文件。
代码
#include <stdlib.h>
int main(){
int * c = malloc(sizeof(int));
free(c);
return 0;
}
gcc编译命令,输出:
$gcc test.C -o test
test.C:8:18: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
int * c = malloc( sizeof(int) );
正如我们所知,这是一个特定于 C++ 的错误,我认为 gcc 的行为类似于 中所述的 C++ 文件
.
这是我的系统信息
Linux ee 4.8.0-36-generic #36~16.04.1-Ubuntu SMP i686 i686 i686 GNU/Linux
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
gedit - Version 3.18.3
我知道我们可以将 malloc()
的 return 值转换为 (int*)
,这显然有效。
但是我们知道malloc()
return类型是void*
见linuxdie malloc()
在 C
中转换 malloc()
的类型是不正确的
是真的只有小写扩展名对 UBUNTU 下的 C 源代码 .c
有效,如果是真的,他们为什么要这样做?
如果不是,我该如何解决这个问题并在我的机器上用 gcc 编译我的 source.C
。
编辑
正如 MCG 在回答中所说,我们可以强制 gcc
将任何给定文件视为特定类型,并用 -x
标志告诉它。
例如,如果我们在 UBUNTU 上有一个扩展名为 .f 的有效 C 源代码,甚至没有任何扩展名的源代码,通过使用此命令,它将被正确编译,
编译任意扩展名的C源代码:
gcc -x c src.f -o src // with .f or any others
gcc -x c src -o src //without extension
GCC 将 .C
(大写字母)扩展名识别为 C++ 文件。您需要将文件的扩展名更改为 .c
(小写字母)。此外,您正确地提到并引用了 C++ 需要在 malloc 的情况下进行强制转换,而在 c 中,存在从任何对象指针类型到 void *.
的隐式转换
请参阅下面关于 GCC 文档中的文件扩展名(.C
和 .c
)的解释。请参阅下面的 GCC link 了解各种文件扩展名的详细说明。
file.C
C++ source code which must be preprocessed. Note that in .cxx, the last two letters must both be literally x. Likewise, .C refers to a literal capital C.
file.c
C source code which must be preprocessed.
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Overall-Options.html
此外,您可以提供标志 -x c
以强制 GCC 将文件视为 C,而不是 C++。
我在 UBUNTU 16.04 LTS 中不小心将 .C
[注意大写 C] 扩展名分配给了我的 C 源代码,并使用 Gedit 程序打开它以输入我的代码。
gcc 编译器无法将其识别为 C 编程源代码,并在尝试编译时产生错误。
并且 UBUNTU 文件管理器将其显示为 cpp 文件。
代码
#include <stdlib.h>
int main(){
int * c = malloc(sizeof(int));
free(c);
return 0;
}
gcc编译命令,输出:
$gcc test.C -o test
test.C:8:18: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
int * c = malloc( sizeof(int) );
正如我们所知,这是一个特定于 C++ 的错误,我认为 gcc 的行为类似于
这是我的系统信息
Linux ee 4.8.0-36-generic #36~16.04.1-Ubuntu SMP i686 i686 i686 GNU/Linux
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
gedit - Version 3.18.3
我知道我们可以将 malloc()
的 return 值转换为 (int*)
,这显然有效。
但是我们知道malloc()
return类型是void*
见linuxdie malloc()
在 C
malloc()
的类型是不正确的
是真的只有小写扩展名对 UBUNTU 下的 C 源代码 .c
有效,如果是真的,他们为什么要这样做?
如果不是,我该如何解决这个问题并在我的机器上用 gcc 编译我的 source.C
。
编辑
正如 MCG 在回答中所说,我们可以强制 gcc
将任何给定文件视为特定类型,并用 -x
标志告诉它。
例如,如果我们在 UBUNTU 上有一个扩展名为 .f 的有效 C 源代码,甚至没有任何扩展名的源代码,通过使用此命令,它将被正确编译,
编译任意扩展名的C源代码:
gcc -x c src.f -o src // with .f or any others
gcc -x c src -o src //without extension
GCC 将 .C
(大写字母)扩展名识别为 C++ 文件。您需要将文件的扩展名更改为 .c
(小写字母)。此外,您正确地提到并引用了 C++ 需要在 malloc 的情况下进行强制转换,而在 c 中,存在从任何对象指针类型到 void *.
请参阅下面关于 GCC 文档中的文件扩展名(.C
和 .c
)的解释。请参阅下面的 GCC link 了解各种文件扩展名的详细说明。
file.C
C++ source code which must be preprocessed. Note that in .cxx, the last two letters must both be literally x. Likewise, .C refers to a literal capital C.
file.c
C source code which must be preprocessed.
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Overall-Options.html
此外,您可以提供标志 -x c
以强制 GCC 将文件视为 C,而不是 C++。