Solaris 上的 GCC - 在“0x00000002”之前解析错误

Posted

技术标签:

【中文标题】Solaris 上的 GCC - 在“0x00000002”之前解析错误【英文标题】:GCC on Solaris - parse error before `0x00000002' 【发布时间】:2015-06-21 06:34:56 【问题描述】:

我正在开发一个在几个平台上编译的 C++ 项目,包括 Windows、Linux 和 Solaris。

代码的 Solaris 版本相当旧。我正在使用几年来所做的更改对其进行更新,并且在 Windows 和 Linux 上编译良好的代码会出现奇怪的编译器错误。

GCC 是 2.95.3 版,在 Solaris 9 (SunOS 5.9) 上。我知道这些都是非常旧的版本。 奇怪的错误是“parse error before”,后跟一个未出现在源文件中的十六进制数字。

这是一个源文件的一小部分错误(不是全部):

./InDB/InDB/Column.cpp:在方法`bool InDB::IndexSorter::operator ()(unsigned int, unsigned int)'中:
./InDB/InDB/Column.cpp:27:在“0x00000002”之前解析错误
./InDB/InDB/Column.cpp:在方法“int InDB::Column::load()”中:
./InDB/InDB/Column.cpp:110:在“0x00000020”之前解析错误
./InDB/InDB/Column.cpp:111:非常量引用类型“int &”的初始化
./InDB/InDB/Column.cpp:111:来自“int”类型的右值

这是 Column.cpp 中包含第 27 行的函数:

bool IndexSorter::operator()(unsigned int _Lhs, unsigned int _Rhs) 
//  Get the two records
    unsigned int _L = Cp->getLookupIndexAt(_Lhs);  // Line 27
    unsigned int _R = Cp->getLookupIndexAt(_Rhs);

//  Now do the comparison
    return (_L < _R);

在 Solaris 代码的旧工作版本和当前版本之间,此函数完全没有变化,但在同一个源文件中还有其他一些变化。

错误消息中的十六进制数字是什么意思? 我该如何解决这个问题?

【问题讨论】:

那么以_开头的名称后跟一个大写字符被保留用于实现。我会先解决这个问题。 查看相关帖子:***.com/questions/228783/… 【参考方案1】:

usr/include/iso/ctype_iso.h from Solaris 8 定义_L

#define _U  0x00000001  /* Upper case */
#define _L  0x00000002  /* Lower case */
#define _N  0x00000004  /* Numeral (digit) */
#define _S  0x00000008  /* Spacing character */
#define _P  0x00000010  /* Punctuation */
#define _C  0x00000020  /* Control character */
#define _B  0x00000040  /* Blank */
#define _X  0x00000080  /* heXadecimal digit */

这破坏了您的代码。这些定义是特定于 Solaris 的,但正如 @juanchopanza 指出的那样,您不应该首先使用这些类型的标识符。

最好的办法是简单地将这些标识符重命名为更合法的名称(只需 LhsRhsLR 应该可以工作,因为这些是局部变量)。

【讨论】:

这些标识符现在只会引起问题是没有意义的,因为完全相同的函数在同一台机器上的早期版本的代码中编译得很好。无论如何我都会尝试更改它们,但我可能会在代码的其他地方发现许多类似的问题。该项目的先前开发人员广泛使用以下划线开头的短变量名称。 @ScottLeis:我能想到的最简单的原因是你开始在某处包含&lt;ctype.h&gt;,其中包括有问题的标题。 对整个项目代码的搜索不会在任何地方显示&lt;ctype.h&gt;。也许项目之外的其他一些文件包括那个文件?项目中肯定添加了一些包含。 您可以随时使用g++ -E 来尝试找出特定#include 的来源。肯定是项目外的#include 我已经确认我的代码间接包含ctype_iso.h,并且该文件中的定义导致了问题(如果我再次见到这个项目的原始开发人员,我会让他知道使用他的代码是什么 PITA)。

以上是关于Solaris 上的 GCC - 在“0x00000002”之前解析错误的主要内容,如果未能解决你的问题,请参考以下文章

Solaris 11, gcc 的安装

solaris - 编译 64 位 gcc - elf 类错误

Sun 在 Solaris 11 上提供 GCC 的 _blsr_u64 标头?

Solaris 10 中的 libv8 安装(SPARC 架构,gcc 4.6.3)

在 Solaris Sparc 下的 ./configure 中强制使用 gcc 编译(而不是 cc)

在Solaris 10 x86下用gcc编译Poco 1.4.6