Windows Visual C ++ 2019 пытается передать переменную препроцессора (-D в linux), ошибка C2143: синтаксическая ошибка: отсутствует ';' перед 'константой' - PullRequest
0 голосов
/ 02 августа 2020

я делаю простой порт с Linux на windows, теперь в Linux я передаю простой -DVERSION = 1, чтобы иметь возможность получить значение в макросе препроцессора: например:

#define APP_NAME  "MyApp " VERSION

в windows, когда я устанавливаю значение ВЕРСИЯ в: Свойства конфигурации, C / C ++, Препроцессор -> Определения препроцессора как:

VERSION=1

Я получаю:

error C2143: syntax error: missing ')' before 'constant'

также, если ВЕРСИЯ определяется в других местах, например:

 char *message = (char*)"MyApp " VERSION "\0";

, получается то же самое:

error C2143: syntax error: missing ';' before 'constant'

когда я наведу указатель мыши на определение ВЕРСИИ, я вижу, что он установлен на 1

1 Ответ

2 голосов
/ 02 августа 2020

С

VERSION=1

тогда VERSION расширяется до целого литерала 1, что означает, что ваш оператор выглядит следующим образом:

char *message = "MyApp " 1 "\0";

Это недопустим, так как вы не можете объединить строковые литералы с целочисленными литералами. Чтобы это работало, вам нужно определить VERSION как строку литерал:

VERSION="1"

Что касается макроса APP_NAME, у вас там аналогичная проблема. Одно из решений такое же, как и выше, - определить VERSION как строку. Но другой вариант - использовать оператор конкатенации поропроцессора ##:

#define APP_NAME  "MyApp " ## VERSION

Или использовать оператор «строкового преобразования» препроцессора #:

#define APP_NAME  "MyApp " #VERSION
...