2009-09-09 22 views
5

Ho bisogno di sapere che la direttiva #define in C++ dichiara l'etichetta globale? Per globale intendo visibile in ogni file?C++ #define preprocessore

sto usando Visual Studio 2008, (indovinate se quello che conta)

risposta

9

No, solo l'unità di traduzione corrente.

I.e. ogni file che ha #define o include un file che ha il #define vedrà la definizione.

Modifica, per rispondere al tuo commento: per ottenere una definizione in ogni file, inseriscilo in un'intestazione che viene inclusa ovunque, oppure utilizzare un'opzione del compilatore per ottenere le definizioni aggiunte.

ad es. per gcc si dovrebbe fare

gcc -Dthedefine=itsvalue 

Non so come si specifica tale include in VC++, ma sono sicuro che è possibile in qualche modo.

+0

hmmmm, come faccio a fare che global in tutti i file? – akif

+2

#include "Global.h" in ogni file. – Goz

+0

include il file di intestazione con #define in ogni file. Prendi in considerazione l'utilizzo dell'intestazione precompilata ... – SadSido

1

Sarà essere definito solo nel file si definisce o nei file che includono il file

3

La direttiva # define sostituti token-stringa per tutti i successivi occorrenze di un identificatore nel file sorgente. L'identificatore è sostituito solo quando forma un token. (Vedere Token C++ nel linguaggio C++ Riferimento.) Ad esempio, l'identificatore non viene sostituito se appare in un commento , all'interno di una stringa o come parte di un identificatore più lungo.

Non è globale, è solo per il file corrente/source

define in msdn

2

Simbolo, definito da "#define" è visibile dal luogo della direttiva fino alla fine della traduzione unità (o al più vicino "#undef" per questo simbolo). Ad esempio, se si definisce qualcosa nel file "file.h", questo simbolo viene visualizzato in "file.h" e in ogni file, che include "file.h", diretto o indiretto ...

1

Qualunque macro hai definito in un file sarà visibile solo in un altro file se hai incluso il file con la macro in esso, quindi non è automaticamente globale. In generale, per questo motivo le macro devono essere definite nei file di intestazione in modo da poter eseguire un #include "headerFile.h".

1

Una direttiva #define renderà la definizione da quel punto nel tempo, fino al completamento della compilazione, tenendo presente che ogni .cpp conta come un'unità di compilazione separata.

per definire qualcosa attraverso i file di origine, che avrebbe bisogno di essere in un file di intestazione che tutti i file di origine includono

2

#define funziona solo in unità di traduzione è definito. Con i file di intestazione condivisi tra unità di traduzione, che potrebbe essere più file.

Tuttavia, per renderlo veramente globale è necessaria un'estensione di Visual Studio. L'opzione della riga di comando/D consente di passare l'equivalente di #define s al preprocessore e è possibile inserirli nella pagina delle proprietà del progetto.Questo è quasi "globale come diventa"; per le soluzioni multiprogetto è possibile utilizzare le finestre delle proprietà del progetto ereditate condivise.

1

È inoltre possibile impostare una finestra delle proprietà dello studio visivo, supportata da un file .vsprops e assegnarla ai progetti pertinenti nella soluzione.

Ciò consentirebbe di mantenere facilmente le impostazioni comuni di molti tipi su più progetti, anche se si trovano in file di soluzione discreti.

http://msdn.microsoft.com/en-us/library/a4xbdz1e%28VS.80%29.aspx