2015-10-07 9 views
7

Supponiamo HoC'è un modo per controllare valore non numerico di un macro

#define Name Joe 

C'è un modo per distinguere diversi valori per la macro. Quanto segue non funziona, ma si ottiene l'idea

#if Name==Joe 
// some code 
#elif Name==Ben 
// some alternative code 
#endif 

Voglio usare questo per vari file oggetto generati dallo stesso codice sorgente. La sorgente differisce solo di poco, quindi può essere facilmente controllata da macro. La macro deve essere inoltrata tramite il flag del compilatore -DName=Joe. Si noti inoltre che il Name sarà un nome effettivo simbolo, quindi non possiamo usare i trucchi basati su #define Joe 1 ecc


costretto modificare Nota che this similar question si occupa in realtà con le macro di stringa a valore. Inoltre le risposte non aiutano. La risposta accettata evita il problema (ma non lo risolve), un'altra risposta utilizza strcmp nelle macro, che fa affidamento su un'estensione, ecc.

+1

Una funzione non funziona per te? Qual è il caso d'uso per questo? – NathanOliver

+3

Probabilmente non vuoi che (problema XY) –

+0

@NathanOliver vedi modifica – Walter

risposta

12

Sì, è possibile, ma non è poi così bello.

Ecco un esempio; cambia NOME e stamperà la cosa corretta. Devi solo definire TEST_FOR_Name in anticipo per ciascun nome, assegnando a ciascuno un valore univoco.

#define TEST_FOR_Joe 1 
#define TEST_FOR_Ben 2 
#define DO_TEST(NAME1, NAME2) DO_TEST_impl(NAME1, NAME2) 
#define DO_TEST_impl(NAME1, NAME2) TEST_FOR_ ## NAME1 == TEST_FOR_ ## NAME2 

#define NAME Ben 

#include <iostream> 

int main() { 
    std::cout << "Hello!" << std::endl; 
#if DO_TEST(NAME, Joe) 
    std::cout << "Joe Found!" << std::endl; 
#elif DO_TEST(NAME, Ben) 
    std::cout << "Ben Found!" << std::endl; 
#else 
    std::cout << "Neither found!" << std::endl; 
#endif 
} 

L'idea di base è che costruiamo gettoni con valori numerici univoci associati a ciascun nome. Se non riesce a trovare un valore per il token, il confronto semplicemente fallisce, ma altrimenti si assicura che i numeri siano gli stessi.

+2

@sergej: immagina se 'Joe' e' Ben' sono tipi: 'NOME var = {3};'. Non funziona se '#define NAME Joe' –

+2

@sergej: stai assumendo che' Joe' e 'Ben' possano essere definiti come numeri arbitrari.Se quei simboli sono invece significativi, o sono già macro, il tuo metodo più semplice non funziona. Il metodo di Charles funziona a prescindere. –

+0

Funzionerebbe ancora con nomi di macro definiti tramite l'opzione del compilatore '-DName = Joe'? – Walter

-1

Abbastanza sicuro che troverai che non puoi solo in C++ ci sono alcuni modi con le estensioni toolchain che le persone hanno trovato, ma non è portabile. Un altro utente chiede qualcosa di simile: Here

+0

che non è portatile ... – Walter

+0

(nota: non ti ho minimizzato) – Walter

+0

neanch'io, ma la "estensione toolchain" nella risposta non accettata alla domanda collegata è una fantasia. Vedi il terzo commento a quella risposta per una spiegazione. – rici

Problemi correlati