Цитирование расширенного значения макроса - PullRequest
3 голосов
/ 12 марта 2012

Это сводит меня с ума. У меня есть макрос, определенный в командной строке с параметром -D

-DFOO="foobarbaz"

А потом я хочу сделать что-то вроде этого

string s = "FOO" ;

Чтобы получить

string s = "foobarbaz" ;

Поскольку очевидно, что кавычки из командной строки удаляются, даже когда я пытаюсь избежать их с помощью \. Я перепробовал все, что мог придумать со строковым форматированием и дополнительными макросами, и это просто не сработало. Либо я получаю ошибку от препроцессора о неуместных знаках #, либо получаю

string s = foobarbaz ;

который явно не скомпилируется.

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Используйте это в командной строке:

-DFOO="\"hello world\""

Например, test.cpp:

#include <cstdio>
#include <string>
#include <iostream>

std::string test = FOO;

int main()
{
    std::cout << test << std::endl;
    return 0;
}

Компиляция и запуск дает:

$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out 
hello world

РЕДАКТИРОВАТЬ Вот как вы это сделаете из Makefile:

DEFS=-DFOO="\"hello world\""

test: test.cpp
    $(CXX) $(DEFS) -o test test.cpp
0 голосов
/ 12 марта 2012

Препроцессоры C и C ++ настроены на C и C ++, они являются не необработанными побайтовыми препроцессорами. Они распознают строки (как в "foo") и не будут совпадать и расширяться внутри них. Если вы хотите развернуть макрос, вы должны сделать это вне строки. Например.,

#define foo "bar"

#include <string>

int main () {
    std::string s = "Hello " foo "! How's it going?";
}

Над строкой расширится до

Hello bar! How's it going?
...