获得奇怪的“预期的主要表达”错误

时间:2010-04-19 01:24:16

标签: c++ methods

在进行方法调用时,我遇到了一个非常奇怪的错误:

   /* input.cpp */

#include <ncurses/ncurses.h>
#include "input.h"
#include "command.h"

Input::Input ()
{
    raw ();
    noecho ();
}

Command Input::next ()
{
    char input = getch ();
    Command nextCommand;

    switch (input)
    {
    case 'h':
        nextCommand.setAction (ACTION_MOVELEFT);
        break;
    case 'j':
        nextCommand.setAction (ACTION_MOVEDOWN);
        break;
    case 'k':
        nextCommand.setAction (ACTION_MOVEUP);
        break;
    case 'l':
        nextCommand.setAction (ACTION_MOVERIGHT);
        break;
    case 'y':
        nextCommand.setAction (ACTION_MOVEUPLEFT);
        break;
    case 'u':
        nextCommand.setAction (ACTION_MOVEUPRIGHT);
        break;
    case 'n':
        nextCommand.setAction (ACTION_MOVEDOWNLEFT);
        break;
    case 'm':
        nextCommand.setAction (ACTION_MOVEDOWNRIGHT);
        break;
    case '.':
        nextCommand.setAction (ACTION_WAIT);
        break;
    }


    return nextCommand;
}

和错误:

Administrator@RHYS ~/code/rogue2
$ make
g++ -c -Wall -pedantic -g3 -O0 input.cpp
input.cpp: In member function `Command Input::next()':
input.cpp:21: error: expected primary-expression before '=' token
input.cpp:24: error: expected primary-expression before '=' token
input.cpp:27: error: expected primary-expression before '=' token
input.cpp:30: error: expected primary-expression before '=' token
input.cpp:33: error: expected primary-expression before '=' token
input.cpp:36: error: expected primary-expression before '=' token
input.cpp:39: error: expected primary-expression before '=' token
input.cpp:42: error: expected primary-expression before '=' token
input.cpp:45: error: expected primary-expression before '=' token
make: *** [input.o] Error 1

对于没有亚麻布感到抱歉,错误发生在“nextCommand.setAction(...)”行上,考虑到它们不包含'=',这完全是奇怪的。

有什么想法吗? 谢谢,

里斯

2 个答案:

答案 0 :(得分:5)

这是我唯一可以想到的(没有看到更多代码)会导致这种情况:

全部大写字母中的标识符是宏,定义如下:

#define ACTION_MOVELEFT = 1
#define ACTION_MOVEDOWN = 2

等等。当扩展宏时,最终得到的代码如下:

case 'h':
    nextCommand.setAction (= 1);
    break;

=不用于定义宏;对于类似对象的宏,宏名称之后的所有内容都将一直到结束宏定义的换行符为替换列表的一部分。因此,宏应定义如下:

#define ACTION_MOVELEFT 1
#define ACTION_MOVEDOWN 2

等等。

但是,您应该考虑使用枚举来强制执行类型安全,并避免在不需要使用时使用预处理器:

enum ActionType
{
    ActionMoveLeft,
    ActionMoveDown
};

或者,至少使用const int而不是#define s。

答案 1 :(得分:2)

通常情况下,如果您确定错误在您认为存在的行上,并且所抱怨的字符不存在,您应该查看预处理器将这些行扩展到哪些内容,例如通过使用gcc -E标志来查看所述预处理器的输出。

我怀疑ACTION_MOVELEFT并且其兄弟可能会扩展到意想不到的事情,但只有查看预处理器输出才能确定。