Как сделать определение препроцессора строки из командной строки в VC 2005 (C ++)? - PullRequest
2 голосов
/ 20 августа 2009

Документация сообщает мне, что для этого можно использовать ключ командной строки / D, например:

  CL /DDEBUG TEST.C

будет определять символ DEBUG, а

  CL /DDEBUG=2 TEST.C

даст ему значение 2. Но что мне делать, если я хотел бы получить эквивалент определения строки, например

  #define DEBUG "abc"

Ответы [ 5 ]

5 голосов
/ 20 августа 2009

Из-за способа анализа командной строки в Windows вам придется экранировать кавычки.

CL /DDEBUG=\"abc\" TEST.C
2 голосов
/ 20 августа 2009

Вы пробовали

CL /DDEBUG=abc TEST.C

или

CL /DDEBUG="abc" TEST.C
1 голос
/ 23 января 2018

Это работает для меня в VS2013:

/D_STRING="\"abc\""

тогда это эквивалентно

#define _STRING "abc"

Обратите внимание, если вы делаете

/D_STRING="abc"

Это будет эквивалентно

#define _STRING abc
1 голос
/ 20 августа 2009

Спасибо, Глен, второй мог работать в командной строке, но сотрудник, о котором я просил, в конечном итоге использовал это в определении проекта (нужно экранировать двойные кавычки и заменить = на #):

/DDEBUG#\"abc\"
0 голосов
/ 20 августа 2009

У меня нет VC, чтобы проверить это для вас, однако в принципе должно работать следующее:

CL /DSTRINGIFY(X)=#X /DDEBUG=STRINGIFY(abc) TEST.C

Обновление:

Как подчеркнул Kuber-Ober, VC, похоже, здесь не правильно делает. Тестируя на простом примере, он генерирует:

const char * s = STRINGIFY(abc);

Может работать с другими компиляторами, например, работает следующая командная строка g ++:

g++ -D'STRINGIFY(X)=#X' -D'DEBUG=STRINGIFY(abc)' t.cc -E

# 1 "t.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "t.cc"

const char * s = "abc";
...