Citando el valor expandido de una macro
-
12-12-2019 - |
Pregunta
Esto me está volviendo loco.Tengo una macro definida en la línea de comando con el -D
opción
-DFOO="foobarbaz"
Y luego quiero hacer algo como esto.
string s = "FOO" ;
Llegar
string s = "foobarbaz" ;
Porque aparentemente las comillas de la línea de comando se eliminan, incluso cuando intento escapar de ellas con \
.Intenté todo lo que pude pensar con stringificación y macros adicionales y simplemente no funcionó.O recibo un error del preprocesador sobre ubicación extraviada #
signos, o termino con
string s = foobarbaz ;
que obviamente no se compilará.
Solución
Utilice esto en la línea de comando:
-DFOO="\"hello world\""
Por ejemplo test.cpp es:
#include <cstdio>
#include <string>
#include <iostream>
std::string test = FOO;
int main()
{
std::cout << test << std::endl;
return 0;
}
Compilando y ejecutando da:
$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out
hello world
EDITAR Así es como lo harías desde un Makefile:
DEFS=-DFOO="\"hello world\""
test: test.cpp
$(CXX) $(DEFS) -o test test.cpp
Otros consejos
Los preprocesadores de C y C++ están ajustados a C y C++, son no preprocesadores sin procesar, byte por byte.Reconocen cadenas (como en "foo"
) y no coincidirá ni se expandirá dentro de ellos.Si deseas expandir una macro, debes hacerlo fuera de una cadena.P.ej.,
#define foo "bar"
#include <string>
int main () {
std::string s = "Hello " foo "! How's it going?";
}
La cadena de arriba se expandiría a
Hello bar! How's it going?