不同 gcc 版本的语法错误?

Syntax error with different gcc version?

提问人: 提问时间:10/1/2008 最后编辑:Andy Lester 更新时间:10/24/2008 访问量:4969

问:

我用 Ubuntu Linux 用 C 语言编写了一个程序,现在我需要将其移植到 UNIX 机器(或者我认为是 UNIX 机器)上。它在我的 Ubuntu 上使用 GCC 编译良好,但是当我尝试在 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 gcc 语法错误

评论

0赞 Doug T. 10/1/2008
char 之前是什么?之前在线?此外,使用“code”标记来格式化代码,使其可读。
0赞 Jonathan Leffler 10/1/2008
对于 GCC:gcc --version 对于 Unix:uname -a

答:

3赞 Leahn Novash 10/1/2008 #1

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

评论

0赞 C. K. Young 10/1/2008
哈哈哈,很好。我认为这是理所当然的,我认为大多数 C 程序员都知道这一点,但我想有些人也认为 C99 语义是理所当然的。9-3
3赞 wnoise 10/1/2008
9年后。我认为不支持 C99 是一个错误。
1赞 Chris Young 10/1/2008
这个答案在许多方面都是不正确的。我不知道“纯 C”是什么意思,因为在 C99 中,你当然可以在语句后声明变量。此外,即使在 C89 中,我相信答案与此相关,也可以正确地说它们必须在块的开头声明,而不是函数。
0赞 Steve Jessop 10/1/2008
@wnoise:你可能是对的,但 GCC 没有实现 C99(不完全),问题中指定的是 GCC。
0赞 Dan Lenski 10/2/2008
@Leahn,虽然严格的 C89 确实不允许变量声明,但 GCC 确实理解这些。它不会给出解析错误,而是给出以下警告:“ISO C90 禁止混合声明和代码”。
0赞 JesperE 10/1/2008 #2

它是什么 UNIX?AIX、Ultrix、Minix、Xenix?

GCC 有一个“--version”标志:

gcc --version
0赞 crashmstr 10/1/2008 #3

要显示 GCC 版本,请执行以下操作:

gcc --version

显示函数可能会有所帮助,以便我们可以看到周围的代码。这通常是“之前解析错误”类型错误的问题。

1赞 Paul Tomblin 10/1/2008 #4

你是怎么把文件复制过来的?你有没有可能插入了一些不应该存在的东西?

顺便说一句:请修正您在代码中对代码标签的使用——如果不在我的浏览器中使用“查看源代码”,目前几乎不可能阅读。

至于你的结束问题:

uname -a
gcc -v
2赞 Martin York 10/1/2008 #5

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

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

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

还要使用正确的 GCC 前端可执行文件: g++ 将把 *.c 文件视为 C++ 文件,除非你明确告诉它不要。因此,如果您要编译真正的 C,请使用 gcc 而不是 g++。

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

为了帮助您解决特定问题,最好看到第 43 行。虽然错误说第 44 行,但很多问题都是由于后面的行有问题,并且解析器直到您到达下一行的第一个词素才检测到问题。

1赞 Steve Jessop 10/1/2008 #6

在尝试编写可移植代码时,以下编译器标志会在您尝试在下一个平台上编译代码之前告诉您很多问题:

-std=c89 -pedantic -Wall

如果你只需要在其他平台上以 GCC 为目标,而不是任何其他编译器,那么你可以尝试:

-std=gnu89 -pedantic -Wall

但我猜这可能允许较新的 GCC 上的 GNU 扩展,而旧的 GCC 不支持。我不确定。

请注意,虽然如果 -pedantic 保证警告所有非标准程序会很好,但事实并非如此。它仍然错过了一些东西。

1赞 Jonathan Leffler 10/1/2008 #7

您必须为我们提供更多错误上下文......至少一行,可能是第 44 行和第 54 行之前的几行。猜一猜,如果你给我们从函数定义开始到第 44 行(可能是第 40 行左右)到第 54 行(或几行之后 - 可能是第 60 行)的代码,那么我们也许能够提供帮助。第 44 行之前的信息出现了问题,导致它期望在第 44 行出现“char”以外的内容;同上(可能是同样的问题)在第 54 行。

1赞 Friedrich 10/1/2008 #8

信息不足。上面的代码至少是插曲的,人们必须 知道人们是否谈论 ANSI C89 或 ANSI C99。从广义上讲,第一个答案是错误的。

问候 弗里德里希

1赞 Dan Lenski 10/2/2008 #9

史蒂夫

第一条错误消息显示“之前”。char 前面的代码是什么?是函数声明吗?它是否包括任何用户定义的类型或类似的东西?parse error'char'

此错误的最可能来源是第 44 行上方的内容使用了在头文件中声明的类型或宏......该头文件可能在您自己的 Ubuntu 系统和您尝试编译的系统之间有所不同。