Препроцессор Visual Studio работает только при установленном / P - PullRequest
0 голосов
/ 28 июля 2011

У меня неуклюжая проблема в Visual Studio 2008. Я пытаюсь определить отображение строки в перечисление, используя файл заголовка конфигурации (назовите его param_defines.h), который выглядит примерно так:

DEFINE_ITEM( A, BOOLEAN )
DEFINE_ITEM( B, INT )
DEFINE_ITEM( C, INT )

И так далее.Затем на него ссылаются во втором файле заголовка (enums.h):

enum ParamType
{
    BOOLEAN = 0,
    INT
};

enum Param
{
    UNKNOWN = -1
#define DEFINE_ITEM( NAME, TYPE ) ,NAME
#include "param_defines.h"
#undef DEFINE_ITEM
};

Затем в третьем (исходном) файле я делаю это:

#include "enums.h"
std::tr1::unordered_map<std::string, int> params;
#define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME
#include "param_defines.h"
#undef DEFINE_ITEM

Когда я компилируюисходный файл и множество ошибок вроде:

error C2065: 'A': undeclared identifier
error C2065: 'B': undeclared identifier
error C2065: 'C': undeclared identifier

Итак, что-то происходит с препроцессором не совсем так, как я хочу.

Кикер это.Я установил / P, поэтому у меня есть какой-то способ диагностировать, что происходит не так.Когда я это делаю, файл успешно компилируется.

1 Ответ

2 голосов
/ 28 июля 2011

Нет, он не компилируется вообще. /P подавляет компиляцию (файл только предварительно обработан, в этот момент проверка синтаксиса не выполняется), так же как /c подавляет связывание.

Поскольку вы не показали нам, как на самом деле выглядят выходные данные, я буду догадываться: вам не хватает точки с запятой в конце #define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME, что приводит к тому, что сгенерированный код выглядит следующим образом:

params["foo"] = foo
params["bar"] = bar
// ...

Добавьте точку с запятой, и если это не поможет, отредактируйте вопрос с более подробной информацией.

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