Получение причудливой ошибки «ожидаемое первичное выражение» - PullRequest
0 голосов
/ 19 апреля 2010

Я получаю действительно странную ошибку при вызове метода:

   /* 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 ]

5 голосов
/ 19 апреля 2010

Вот единственное, о чем я могу подумать (не видя больше кода), что могло бы вызвать это:

Ваши идентификаторы в заглавных буквах - это макросы, определенные примерно так:

#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 с.

2 голосов
/ 19 апреля 2010

Как правило, если вы уверены, что ошибки находятся в тех строках, о которых вы думаете, и о том, на кого жаловался символ, не существует, вам следует посмотреть, во что препроцессор расширяет эти строки, например используя флаг gcc -E, чтобы увидеть выходные данные указанного препроцессора.

Я подозреваю, что ACTION_MOVELEFT и его братья могут расшириться до чего-то неожиданного, но только просмотр выходных данных препроцессора точно скажет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...