2012-12-05 17 views
5

Sto utilizzando il seguente codice in un file make per accedere a una variabile VENDOR_NAME da un file CPP.Utilizzo di una variabile di stringa del file di creazione nel file CPP

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAME contiene una stringa.

Nel mio file cpp quando tento di utilizzare questa variabile, ricevo degli errori come indicato di seguito.

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8: 'Default_Vendor' non dichiarato (prima utilizzare questa funzione) Feature1.cpp.bak.cpp:8: (Ogni identificatore non dichiarato è riportato solo una volta per

Credo che questo è perché il mio stringa non contiene virgolette doppie e compilatore è considerare il contenuto di VENDOR_NAME come variabile

Come ottenere questa variabile come una stringa nel mio file CPP in modo che possa usarla come se fosse #define edita?

Grazie ...

risposta

10

Il makefile sta per creare una riga di comando per il compilatore. Il problema che si pone è che se si circondano il valore tra virgolette:

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)" 

... il guscio vedrà le citazioni come semplicemente delineare un argomento della riga di comando, in modo che probabilmente li spogliano (anche se può dipendere dalla shell che stai usando). Per evitare questo, si desidera creare l'argomento con le citazioni escape:

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\"" 

Credo che la maggior parte delle conchiglie tipiche, almeno per Windows e Linux, accetterà un back-slash come una fuga di preservare la le virgolette, ma sono sicuro che ce ne sia almeno una per cui dovrai fare la quotazione in modo diverso.

+0

che manca un livello di espansione di macro ... difficile – Potatoswatter

+0

@Potatoswatter: non più! :-) –

+0

@ Jerry Coffin: Grazie. Questo è più che sufficiente per salvare il giorno .. Arrivederci ai macro :) – NeonGlow

3

Utilizzare il preprocessore per trasformarlo in una stringa.

#define stringify(x) stringify_literal(x) 
#define stringify_literal(x) # x 

std::cout << stringify(VENDOR_NAME); 

dato un supporto preprocessore per le macro variadic (ufficialmente C++ 11, in pratica a disposizione molto più a lungo), VENDOR_NAME può includere una virgola:

#define stringify(...) stringify_literal(__VA_ARGS__) 
#define stringify_literal(...) # __VA_ARGS__ 

std::cout << stringify(VENDOR_NAME); 
+1

Potrebbe presentare problemi se "VENDOR_NAME" contiene una virgola (ad esempio "Foo, Inc."). Probabilmente è meglio occuparsi di citare il makefile stesso. – jamesdlin

+0

@Potatoswatter: Grazie mille per la risposta. Sarà più utile se posso farlo nel file make stesso. Per favore fammi sapere se puoi aiutare. – NeonGlow

+0

@jamesdin: Grazie per aver segnalato. Puoi aiutarmi ulteriormente su come farlo? – NeonGlow

Problemi correlati