Solaris上的GCC - 在“0x00000002”

时间:2015-06-21 06:34:56

标签: c++ gcc solaris

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

Solaris版本的代码很老了。我正在使用多年来所做的更改来更新它,并且使用在Windows和Linux上编译良好的代码来获得奇怪的编译器错误。

GCC是Solaris 9(SunOS 5.9)上的2.95.3版。我知道这些都是很老的版本 奇怪的错误是“之前的解析错误”,后跟一个没有出现在源文件中的十六进制数字。

以下是一个源文件的错误(不是全部)的一小部分示例:

./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代码的旧版本和当前版本之间根本没有更改,但在同一源文件中还有其他一些更改。

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

1 个答案:

答案 0 :(得分:4)

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应该有效,因为这些是本地变量)。