不同gcc版本的语法错误?

时间:2020-03-06 14:56:48  来源:igfitidea点击:

我用Ubuntu Linux用C语言编写了一个程序,现在我需要将其移植到UNIX机器(或者我认为是UNIX机器的机器)上。它可以在我的带有GCC的Ubuntu上很好地编译,但是当我尝试在UNIX框上使用GCC编译它时,出现此错误:

a.c: In function `goUpDir':
a.c:44: parse error before `char'
a.c:45: `newDir' undeclared (first use in this function)
a.c:45: (Each undeclared identifier is reported only once
a.c:45: for each function it appears in.)
a.c: In function `goIntoDir':
a.c:54: parse error before `char'
a.c:57: `newDir' undeclared (first use in this function)
a.c:57: `oldDir' undeclared (first use in this function)

主要问题似乎是char之前的解析错误(其他相关)

44  char newDir[50] = ""; 
54  char* oldDir = (char*)get_current_dir_name();

这些只是简单的C样式字符串声明。是否需要包含头文件才能使其在UNIX中工作?

P.S.什么命令可以查看我们使用的是哪个版本的unix和哪个版本的gcc?知道这一点后,我将可以更具体地回答我的问题。

谢谢

解决方案

如果要编译纯C,则必须在函数开始时声明变量。我之所以这样说是因为大多数人使用C ++编译器来编译C程序,从而提供了纯C编译器通常不可用的一些资源,最常见的示例是//注释行。

这是什么UNIX? AIX,Ultrix,Minix,Xenix?

GCC具有" --version"标志:

gcc --version

要显示GCC版本:

gcc --version

可能有助于显示该功能,因此我们可以看到周围的代码。这通常是"之前解析错误"类型错误的问题。

我们是如何复制文件的?我们插入的内容是否可能不存在?

顺便说一句:请修正我们在代码中对代码标记的使用,如果不使用我的浏览器中的"查看源代码",当前几乎无法读取。

至于你结束的问题:

uname -a
gcc -v

如果要确保代码可移植,请始终使用-pedantic或者-pedantic-errors。

这将在代码偏离标准合规性的地方提供警告/错误。

当我们在讨论这个话题时。我们可能还应该打开所有警告。编译器会警告我们,这是有充分的理由的。当将代码从一个平台迁移到另一个平台时,这些警告是潜在错误的根源,因为新的硬件/操作系统/编译器的行为可能与我们当前的错误不同。

还要使用正确的GCC前端可执行文件:g ++会将* .c文件与C ++文件一样对待,除非我们明确不告诉它。因此,如果我们要编译真实的C语言,请使用gcc而不是g ++。

gcc -pedantic -Wall -Werror  *.c

  g++ -pedantic -Wall -Werror  *.cpp

为了帮助解决特定问题,最好看一下第43行。尽管该错误显示第44行,但许多问题是由进行中的行引起的,并且直到我们到达第一个词素才由解析器检测到该问题在下一行。

在尝试编写可移植代码时,以下编译器标志将告诉我们很多问题,然后再尝试在下一个平台上编译代码:

-std=c89 -pedantic -Wall

如果我们只需要在其他平台上定位GCC,而无需在其他任何编译器上定位,则可以尝试:

-std=gnu89 -pedantic -Wall

但是我想这可能允许较新版本的GCC上的GNU扩展,而较旧版本的GCC不支持。我不知道。

请注意,尽管可以保证-pedantic对所有非标准程序发出警告会很好,但事实并非如此。它仍然遗漏了一些东西。

我们将不得不为我们提供更多有关错误的上下文信息……至少在第44和54行之前,可能有几行。猜测一下,如果我们从函数定义的开头在第44行之前给我们提供代码(也许第40行左右)到第54行(或者几行,也许到第60行,那么我们可能会提供帮助。)第44行之前的信息有些问题,导致它期望第44行不是'char' ;第54行的同上(可能是相同的问题)。

信息不足。上面的代码至少是有趣的,并且必须
知道有人谈论ANSI C89还是ANSI C99. 从广义上讲,第一个答案是错误的。

问候
弗里德里希

史蒂夫

第一条错误消息是"解析错误"之前"字符"之前。 char之前的代码是什么?它是函数声明吗?它是否包含任何用户定义的类型或者种类?

该错误的最有可能的根源是,在第44行上方不久的某处使用了在头文件中声明的类型或者宏...该头文件在我们自己的Ubuntu系统和我们尝试在其上进行编译的系统之间可能有所不同。