在头文件中,我有以下枚举:
namespace OBJ_VERBS {
enum { zero,
CUDDLE, EMBRACE, FLIP, GROPE, HUG,
KISS, LICK, NUDGE, PAT, PINCH,
POKE, PULL, RUB, SHAKE, SQUEEZE,
TAP, TUG, TURN, WAVE, PEER,
PET, CLENCH, CURSE, NUZZLE, SNAP,
STROKE, TWIRL, LEAN, GRIP, SMELL,
GRUNT, SQUEAL, SCOLD, GAZE, WIND,
SPIT, SPIN, DANCE, SING,
zTOTAL};
const int _MAX_ = int(OBJ_VERBS::zTOTAL - 1);
}
我收到以下错误:错误:预期标识符
我尝试在网上搜索" SING "是关键字,但事实并非如此。
有什么想法吗?
答案 0 :(得分:10)
我打赌你包括(直接或间接)math.h
。
一点调查显示:
$ grep -r -w SING /usr/include/
/usr/include/math.h:#define SING 2
由于它是#define
d到2,enum
会尝试使用2
作为枚举成员,但会因上面给出的错误而失败。
请注意,我(必须)根据我在本地的包含文件来猜测这里发生了什么。您可能会遇到完全不同的问题导致问题,但最可能的罪魁祸首是包含文件中的#define
。请参阅我上面使用的grep
我是如何找到的。
这就是为什么使用(例如)OV_CUDDLE
,OV_EMBRACE
等来减少碰撞通常是个好主意。
对于它的价值,SING
中math.h
的背景是:
/* Types of exceptions in the `type' field. */
# define DOMAIN 1
# define SING 2
# define OVERFLOW 3
# define UNDERFLOW 4
# define TLOSS 5
# define PLOSS 6
答案 1 :(得分:0)
当然,abligh最有可能找到了罪魁祸首。但是,根据C ++标准,标识符SING
应该是合法的,因此可供您使用。测试这个的最好方法是
#ifdef SING
# error 'SING' pre-#defined -- use only standard compatible headers.
#endif
如果你只#include C ++标准头文件(例如cmath
)和符合C ++标头,那么这不应该发生。这些标头必须仅使用用户不合法使用的标识符。如果问题仍然存在,那么您在使用或第三方库的标准库实现中遇到了错误/功能。
答案 2 :(得分:0)
abligh是现货。我正在使用math.h,这是我在那里找到的。
#define DOMAIN _DOMAIN
#define SING _SING
#define OVERFLOW _OVERFLOW
#define UNDERFLOW _UNDERFLOW
#define TLOSS _TLOSS
#define PLOSS _PLOSS
// Constant definitions for the exception type passed in the _exception struct
#define _DOMAIN 1 // Argument domain error
#define _SING 2 // Argument singularity
#define _OVERFLOW 3 // Overflow range error
#define _UNDERFLOW 4 // Underflow range error
#define _TLOSS 5 // Total loss of precision
#define _PLOSS 6 // Partial loss of precision
谢谢大家的快速反应。