我正在开发一个在几个平台上编译的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代码的旧版本和当前版本之间根本没有更改,但在同一源文件中还有其他一些更改。
十六进制数字在错误消息中的含义是什么?
我该如何解决这个问题?
答案 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所指出的那样。
最好的办法是简单地将这些标识符重命名为更合法的标识符(只需Lhs
,Rhs
和L
,R
应该有效,因为这些是本地变量)。