【问题标题】:gcc not recognize *.C source code as valid c programgcc 无法将 *.C 源代码识别为有效的 c 程序
【发布时间】: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


【解决方案1】:

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++。

【讨论】:

  • 谢谢。请从您的链接中添加一些信息(您可以使用 -x 选项显式指定输入语言)以及我对@MarkPlotnick 的评论,我们甚至可以通过给它-x c 选项来编译没有扩展名或带有gcc 的任何扩展名。
  • 请提供有关此问题的一些信息。正如我在帖子的 cmets 部分所说,如果我们给 gcc 一个没有扩展名的文件,它会产生f: file not recognized: File format not recognized collect2: error: ld returned 1 exit status。但在*.C 文件案例中的帖子问题中,gcc 实际上表现得像 cpp 源代码。 gcc 编译器中是否有任何标志可以使用并显示这种不当行为?
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多