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

GCC on Solaris - parse error before `0x00000002'

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

代码的 Solaris 版本很旧。我正在使用几年来所做的更改对其进行更新,并使用在 Windows 和 Linux.

上编译良好的代码得到奇怪的编译器错误

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

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

./InDB/InDB/Column.cpp: In method `bool InDB::IndexSorter::operator ()(unsigned int, unsigned int)':
./InDB/InDB/Column.cpp:27: parse error before `0x00000002'
./InDB/InDB/Column.cpp: In method `int InDB::Column::load()':
./InDB/InDB/Column.cpp:110: parse error before `0x00000020'
./InDB/InDB/Column.cpp:111: initialization of non-const reference type `int &'
./InDB/InDB/Column.cpp:111: from rvalue of type `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 代码的旧版本和当前版本之间完全没有变化,但同一源文件中还有其他几处变化。

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

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 应该可以工作,因为这些是局部变量).