不同gcc版本的语法错误?
我用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系统和我们尝试在其上进行编译的系统之间可能有所不同。