Как сделать, чтобы значение -D из строки cmd стало строкой? - PullRequest
2 голосов
/ 07 февраля 2012

У меня сложная проблема. Я хотел бы подделать C содержимое исходного файла в соответствии с командной строкой компилятора. Например (с помощью VC):

Если я использую командную строку

cl -c -E -Dfoo=rice test.c

Я хочу получить фактическое C содержимое (после предварительной обработки):

char *s = "rice";

Если я использую командную строку

cl -c -E -Dfoo=ball test.c

Я хочу получить фактическое C содержание исходного файла:

char *s = "ball";

Теперь находим решение ...

ПЕРВЫЙ ПОПРОБ:

// test.c
#define STRNAME(n) #n
char *s = STRNAME(foo);

- Не повезло. Независимо от того, какой foo определен в командной строке, я всегда получаю

char *s = "foo"; // Oh no!

ВТОРАЯ ПОПРОБУЙТЕ (самое близкое изображение, но все еще многословно):

// test.c
#define STRNAME(n) #n
char *s = foo;

На этот раз я должен подробно изменить командную строку:

cl -c -E -Dfoo=STRNAME(rice) test.c

Теперь я получаю

 char *s = "rice";

Есть ли способ помочь мне выбраться из этого многословия?

Кстати: я действительно не люблю вводить кавычки в аргументы команды (сделать их частью argv[x], потому что вы не сможете писать такие командные строки надежно и переносимо в Windows CMD и Linux Bash - Я думаю.

Ответы [ 2 ]

6 голосов
/ 07 февраля 2012

Вам необходим дополнительный уровень косвенности в препроцессоре, чтобы сначала расширить ваш макрос. Что-то вроде:

#define STRNAME1(n) #n
#define STRNAME(n) STRNAME1(n)
char *s = STRNAME(foo);

Это довольно распространенный шаблон, в результате которого макрос расширяется и затем преобразуется в строку, а не просто преобразуется в строку.

3 голосов
/ 07 февраля 2012

Вы пытались передать строку в кавычках -D?Вы должны быть в состоянии сделать это, правильно экранируя кавычки:

-D'foo="rice"'
...