2009-07-06 19 views
42

Se ho una dichiarazione # define all'interno di uno spazio dei nomi in quanto tale:dichiarazioni #define all'interno di uno spazio dei nomi

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
} 

Ho ragione nel dire che la dichiarazione #define non è limitato allo spazio dei nomi?

È la seguente cosa "corretta" da fare?

namespace MyNamespace 
{ 
    const unsigned int SOME_VALUE = 0xDEADBABE; 
} 
+3

Corretto in entrambi i casi. –

risposta

54

Corretto, #define non sono associati ai namespace. #define è una direttiva preprocessor - risulta nella manipolazione del file di origine prima di essere compilata tramite il compilatore. I namespace vengono utilizzati durante la fase di compilazione e il compilatore non ha informazioni su #define.

Si dovrebbe cercare di evitare il preprocessore il più possibile. Per valori costanti come questo, preferisci const su #define.

+1

+1: l'ultima istruzione mi ricorda Effective C++ –

+1

constexpr è l'equivalente più appropriato dell'espressione valore constnt di # define – jaskmar

3

Sì. In generale, l'uso di valori const anziché # define'd valori ha molti vantaggi. Limitare l'ambito della variabile è uno dei vantaggi. L'ambito può essere limitato a uno spazio dei nomi oa qualsiasi altro ambito valido in questo modo (anche a livello di classe, livello di funzione, ecc.).

4

Il preprocessore opera (concettualmente, almeno, e spesso in realtà troppo) prima di namespace e altri concetti a livello di linguaggio "calcio in" - quindi sì, è sicuramentemolto meglio usare costrutti a livello di linguaggio come Valori const ovunque tu sia possibile!

0

Se, per qualche motivo, non è possibile passare al secondo caso, sono abbastanza sicuro che dovresti occuparti di compilare MyNamespace nel proprio oggetto e collegare gli oggetti separatamente (o possibilmente solo eseguire il preprocessore su quel singolo namespace da solo). Il preprocessore C++ dovrebbe prendere l'istruzione #define ed essenzialmente sostituire una stringa ovunque che SOME_VALUE sia visto nel codice sorgente. Quindi se il preprocessore non è a conoscenza di #define, SOME_VALUE non può essere sostituito in un altro file sorgente.

18

Sono completamente d'accordo con i suggerimenti sull'uso delle costanti e l'ambito è illimitato per #define s.

Tuttavia, se si fare devono utilizzare preprocessore #define linee, si prega di coprire in modo corretto per l'ambito previsto,

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
    // your code 
    #undef SOME_VALUE 
} 

Perché #defines?
Conosco un caso in cui una piattaforma incorporata non supportava le costanti nel codice.
Non è stato possibile inizializzarli ...
È sempre utile essere più leggibili.

Problemi correlati