Цитирование расширенного значения макроса
-
12-12-2019 - |
Вопрос
Это сводит меня с ума.У меня есть макрос, определенный в командной строке с помощью -D
вариант
-DFOO="foobarbaz"
И тогда я хочу сделать что-то вроде этого
string s = "FOO" ;
Получить
string s = "foobarbaz" ;
Потому что, по-видимому, кавычки из командной строки удаляются, даже когда я пытаюсь избежать их с помощью \
.Я перепробовал все, что мог придумать, с помощью stringification и дополнительных макросов, но это просто не сработает.Либо я получаю сообщение об ошибке от препроцессора о неуместном #
знаки, или я закончу с
string s = foobarbaz ;
который, очевидно, не будет компилироваться.
Решение
Используйте это в командной строке:
-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
.
DEFS=-DFOO="\"hello world\""
test: test.cpp
$(CXX) $(DEFS) -o test test.cpp
. Другие советы
Препроцессоры 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?