使用" SING"在C enum中错误到"期望一个标识符"

时间:2014-11-30 17:38:11

标签: c++

在头文件中,我有以下枚举:

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 "是关键字,但事实并非如此。

有什么想法吗?

3 个答案:

答案 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_CUDDLEOV_EMBRACE等来减少碰撞通常是个好主意。

对于它的价值,SINGmath.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

谢谢大家的快速反应。