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

时间:2017-08-28 21:54:36

标签: c gcc ubuntu-16.04

我不小心将.C [注释到大写C]扩展名分配给UBUNTU 16.04 LTS中的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

1 个答案:

答案 0 :(得分:3)

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

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

  

file.C

     

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

     

file.c

     

必须预处​​理的C源代码。

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

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