Citando o valor expandido de uma macro
-
12-12-2019 - |
Pergunta
Isso está me deixando louco.Eu tenho uma macro definida na linha de comando com o -D
opção
-DFOO="foobarbaz"
E eu quero fazer algo parecido com isso
string s = "FOO" ;
Para obter
string s = "foobarbaz" ;
Porque, aparentemente, as aspas na linha de comando são removidos para longe, mesmo quando eu tento escapar-los com \
.Já tentei de tudo que eu poderia pensar com stringification e macros adicionais e ele simplesmente não funcionam.Ou eu recebo um erro do pré-processamento sobre extraviado #
sinais, ou eu acabo com
string s = foobarbaz ;
o que, obviamente, não vai compilar.
Solução
Usar a linha de comando:
-DFOO="\"hello world\""
Por exemplo test.cpp é:
#include <cstdio>
#include <string>
#include <iostream>
std::string test = FOO;
int main()
{
std::cout << test << std::endl;
return 0;
}
Compilando e executando dá:
$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out
hello world
EDITAR Esta é a forma como você o faria a partir de um Makefile:
DEFS=-DFOO="\"hello world\""
test: test.cpp
$(CXX) $(DEFS) -o test test.cpp
Outras dicas
C e C++ preprocessadores são afinadas em C e C++, eles são não matérias, byte por byte preprocessadores.Eles reconhecem seqüências de caracteres (como no "foo"
) e não coincidem e expandir dentro deles.Se você deseja expandir uma macro, você deve fazê-lo fora de uma seqüência de caracteres.E. g.,
#define foo "bar"
#include <string>
int main () {
std::string s = "Hello " foo "! How's it going?";
}
Seqüência de caracteres acima iria expandir-se para
Hello bar! How's it going?