【发布时间】:2018-02-06 05:54:18
【问题描述】:
我不小心为我在 UBUNTU 16.04 LTS 中的 C 源代码分配了 .C [note to Uppercase 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 的行为就像 this 中所说的 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() 的返回值转换为(int*),这显然可以工作。
但是我们知道malloc()返回类型是void*见linuxdie malloc()
在 C why not cast return of malloc() 中转换 malloc() 的类型是不正确的
是真的只有小写扩展对 UBUNTU 下的 C 源代码.c 有效,如果是真的他们为什么要这样做?
如果不是,我该如何解决这个问题并在我的机器上使用 gcc 编译我的 source.C。
编辑
正如MCG 在答案中所说,我们可以强制gcc 将任何给定文件视为特定类型,并使用-x 标志告诉它。
例如,如果我们有一个带有 .f 扩展名的 C 有效源代码,甚至是在 UBUNTU 上没有任何扩展名的源代码,使用此命令将正确编译,
使用任何扩展编译 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++源代码。 -
@EsmaeelE 很容易与此类事物混淆,例如 C++ 源代码的扩展名
.C。特别是当它看起来不像广泛使用的扩展时。因此,我认为,这个问题本身并不坏。它将一个重定向到正确的方向。因此投了赞成票。然而,即使在 gentoo 上,gcc 仍然是 gcc。 Ubuntu 也不例外 :) 这就是我的意思。 -
如果 gcc 没有正确猜测到您的程序是 C,则给 gcc
-x c选项。 -
也赞成。我不明白为什么这是一个糟糕的问题。
标签: c gcc ubuntu-16.04