Citando il valore espanso di una macro
-
12-12-2019 - |
Domanda
Questo mi sta guidando dadi.Ho una macro definita sulla riga di comando con l'opzione -D
-DFOO="foobarbaz"
.
e poi voglio fare qualcosa come questo
string s = "FOO" ;
.
per ottenere
string s = "foobarbaz" ;
.
Poiché apparentemente le citazioni dalla riga di comando vengono allungate via, anche quando provo a sfuggirli con \
.Ho provato tutto ciò che potevo pensare con la stroniera e le macro aggiuntive e semplicemente non funzionerà.O ottengo un errore dal preprocessore sui segni generatori di #
sbagliati, o finisco con
string s = foobarbaz ;
.
che ovviamente non si compilerà.
Soluzione
Usa questo sulla riga di comando:
-DFOO="\"hello world\""
.
Ad esempio Test.cpp è:
#include <cstdio>
#include <string>
#include <iostream>
std::string test = FOO;
int main()
{
std::cout << test << std::endl;
return 0;
}
.
Compilazione e funzionamento dà:
$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out
hello world
.
Modifica Ecco come lo faresti da un MakeFile:
DEFS=-DFOO="\"hello world\""
test: test.cpp
$(CXX) $(DEFS) -o test test.cpp
. Altri suggerimenti
I preprocessori C e C ++ sono sintonizzati su C e C ++, sono non preprocessori di byte-byte-byte.Riconoscono le stringhe (come in "foo"
) e non corrispondono ed espanderanno dentro di loro.Se si desidera espandere una macro, devi farlo al di fuori di una stringa.Ad esempio.,
#define foo "bar"
#include <string>
int main () {
std::string s = "Hello " foo "! How's it going?";
}
.
sopra la stringa si espanderebbe a
Hello bar! How's it going?
.