2015-11-05 14 views
7

AFAIK, i simboli sono utili per impedire l'analisi multipla. Se entrambi a.h e b.h includono c.h, unAmbito di un simbolo C++

#ifndef C_H 
#define C_H 
... 
// c.h definition would go here 
... 
#endif 

impedirà c.h dall'essere "analizzata" (credo che non è la parola giusta) più di una volta. qualcosa

Tuttavia, ho visto come

#ifdef WIN32 
... 

in codice di altre persone. Quel simbolo deve essere stato definito da qualche altra parte perché una ricerca di

#define WIN32 

nell'intero progetto restituisce vuoto. La mia domanda è: dove sono effettivamente definiti questi simboli? Il sistema operativo mantiene qualcosa di simile a un pool di simboli che diversi programmi possono utilizzare per interrogare il sistema operativo o altre proprietà dei processi?

+0

È possibile impostare le definizioni del preprocessore dalle impostazioni della riga di comando/opzioni ide. In VS, guarda sotto "C/C++ -> Preprocessore". –

risposta

5

ci sono due opzioni in cui quelli che non sono nel codice stesso possono provenire da:

  1. La suite compilatore si pone come un default quando si avvia la compilazione del codice.
  2. Si fornisce al compilatore (o al preprocessore, per l'esattezza) un elenco di quelle definizioni quando si compila il codice (o le preferenze del progetto IDE lo fanno quando si utilizza un IDE. Ad esempio, in Visual Studio 2013 troverai quelli quando apri Progetto> Proprietà> Proprietà di configurazione> C/C++> Preprocessore> Definizioni del preprocessore).

In generale, queste definizioni non sono utilizzati solo per la ragione che si descrive (come includere guardie), ma anche per attivare o codice di disabilitazione basato sulla piattaforma che si svilupperà per - ad esempio, si può avere solo rami di codice compilato per Windows, o solo se si utilizza un compilatore a 64 bit.

+0

brillante. Molte grazie. – roymcclure

1

Per quanto ne sappia questo fa parte del compilatore che si usa.

1

Il compilatore Microsoft C++ definisce internamente alcune macro come WIN32, ecco perché non è definito in alcuna intestazione particolare. Quindi quando costruisci un file sorgente con VC++ le cose all'interno di #ifdef WIN32 vengono compilate, ma non su Linux gcc.

Anche la tua nomenclatura è un po 'off - questi sono chiamati macro di preprocessore, non simboli. I nomi delle variabili, delle funzioni, ecc. Nel codice sono simboli.

+0

Grande, grazie per il suggerimento. – roymcclure

1

Ogni compilatore ha un elenco di macro definite. MSVC definisce WIN32 quando la destinazione di compilazione è Windows a 32 bit.

+0

definisce anche WIN32 quando si punta a Windows a 64 bit, credo (perché Microsoft) – kcraigie