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 指出的那样,您首先不应使用这些类型的标识符。
你最好的选择是简单地将这些标识符重命名为更合法的东西(简单地 Lhs
、Rhs
和 L
、R
应该可以工作,因为这些是局部变量).
我正在开发一个在几个平台上编译的 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 指出的那样,您首先不应使用这些类型的标识符。
你最好的选择是简单地将这些标识符重命名为更合法的东西(简单地 Lhs
、Rhs
和 L
、R
应该可以工作,因为这些是局部变量).