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

GCC on Solaris - parse error before `0x00000002'

本文关键字:错误 0x00000002 GCC Solaris 上的      更新时间:2023-10-16

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

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

GCC的版本是2.95.3,在Solaris 9(SunOS 5.9)上。我知道这些都是非常旧的版本
奇怪的错误是"parseerrorbefore",后面跟着一个没有出现在源文件中的十六进制数字。

以下是一个源文件的错误小样本(并非全部)

/InDB/InDB/Column.cpp:在方法`bool InDB::IndexSorter::operator()(unsigned int,unsigned整型)'中:./InDB/InDB/Column.cpp:27:在"0x00000002"之前解析错误./InDB/InDB/Column.cpp:In方法`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代码和当前版本之间没有任何变化,但在同一个源文件中还有其他几个变化。

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

Solaris 8中的usr/include/iso/ctype_iso.h定义了_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的,不过正如@juancopanza所指出的,您不应该首先使用这些类型的标识符。

最好的办法是简单地将这些标识符重命名为更合法的标识符(简单地说,LhsRhsLR应该有效,因为它们是局部变量)。