Вопрос

Это сводит меня с ума.У меня есть макрос, определенный в командной строке с помощью -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
.

Редактировать Вот как вы сделаете это из makefile:

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?
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top