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á.

¿Fue útil?

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?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top