1

我用 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 中工作?

PS查看什么版本的unix和你使用的gcc版本的命令是什么?知道这一点将使我的问题更具体。

谢谢

4

9 回答 9

3

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

于 2008-09-30T20:31:39.813 回答
2

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

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

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

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

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

为了帮助解决您的具体问题,可能会很高兴看到第 43 行。虽然错误说第 44 行,但很多问题是由于前面的行有问题并且解析器没有检测到问题,直到您到达第一个词位在下一行。

于 2008-09-30T20:38:17.910 回答
1

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

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

至于你结束的问题:

uname -a
gcc -v
于 2008-09-30T20:34:22.413 回答
1

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

-std=c89 -pedantic -Wall

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

-std=gnu89 -pedantic -Wall

但我猜这可能允许在较旧的 GCC 上不支持的较新 GCC 上的 GNU 扩展。我不知道。

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

于 2008-09-30T21:41:17.027 回答
1

您将不得不为我们提供更多有关错误的上下文...至少一个,可能在第 44 行和第 54 行之前的几行。猜测一下,如果您在第 44 行之前给我们函数定义开头的代码(也许第 40 行左右)到第 54 行(或几行之后 - 可能是第 60 行 - 然后我们可能会提供帮助。第 44 行之前的信息出现了问题,导致它在第 44 行;第 54 行同上(可能是同样的问题)。

于 2008-10-01T02:28:32.500 回答
1

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

问候弗里德里希

于 2008-10-01T05:38:03.777 回答
1

史蒂夫,

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

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

于 2008-10-01T20:11:05.830 回答
0

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

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

gcc --version
于 2008-09-30T20:33:27.500 回答
0

要显示 GCC 版本:

gcc --版本

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

于 2008-09-30T20:33:32.883 回答