2015-05-02 21 views
5

Che cosa è la ragione per cui ci sono 2 possibilità:Qual è la differenza tra le variabili globali e # define in c

  1. variabili globali
  2. costanti simboliche con #define?

Quindi so cosa fa #define ma non so quale sia la differenza in uso. Quale situazione devo avere in tal modo sono in grado di decidere me stesso sulle giuste opportunità? Qual è una delle opportunità in grado di fare ciò che l'altro non fa? Spero di poter chiarire cosa intendo.

+0

Le variabili globali sono accessibili e modificabili da qualsiasi luogo. Le costanti #define non possono essere modificate, basta leggere. Ha a che fare con la sicurezza delle filettature e il rientro delle funzioni. – shinzou

+0

"* So cosa #define fa *" Sicuro? ;-) Tuttavia, leggere questo https://gcc.gnu.org/onlinedocs/cpp/ potrebbe aiutarti a ottenere l'illuminazione. – alk

+0

Una variabile 'global' è una variabile, puoi cambiarne il valore a meno che tu non la renda un' const', '# define' sia un valore fisso. Non può essere cambiato affatto. –

risposta

4

Bene, le variabili globali possono essere modificate da qualsiasi luogo.

Fondamentalmente, nel livello basso, una variabile viene archiviata nella memoria RAM e creata dopo l'avvio dell'applicazione, ha sempre un indirizzo nella RAM. Le definizioni sono solo macro, il compilatore sostituirà semplicemente i nomi di definizione con i relativi valori nel passo della compilazione.

#define non può essere modificato, è solo un macro. E #define non è solo di valori, è possibile definire quasi tutto ciò che si desidera, ad esempio:

// Defining a constant 
#define PI 3.14 

// Defining an expression 
#define MIN(x,y) ((x)<(y))?(x):(y) 

// Defining a piece of code 
#define STOP_TIMER \ 
    clock_gettime(CLOCK_REALTIME, &__t1); \ 
    __lasttime = \ 
    (double) (__t1.tv_sec - __t0.tv_sec) + \ 
    (double) (__t1.tv_nsec - __t0.tv_nsec)/1000000000.0; 

e, nella maggior parte delle situazioni, definisce vengono utilizzati per impostare alcuni valori specifici del sistema operativo o di specifici dell'hardware. È una cosa davvero potente, perché ti dà l'opportunità di cambiare le cose in modo dinamico nella fase di compilazione. Ad esempio:

// Example with OS 
#ifdef __linux__ 
    #define WELCOME_STRING "welcome to Linux!" 
#else 
    #define WELCOME_STRING "welcome to Windows!" 
#endif 

// Example with hardware 
#if __x86_64__ || __ppc64__ 
    #define USING_64BIT 
#else 
    #define USING_NOT64BIT 
#endif 
+0

Pertanto il l'unica differenza tra una variabile globale costante e una macro è la memoria (la variabile globale const è memorizzata in memoria e una macro no), non è vero? –

+0

@ Clock_9 Sì, questa è una delle differenze, ma non l'unico. Non è possibile memorizzare una parte di codice nella variabile ordinale e non è possibile eseguire elementi specifici del sistema con variabili. – FalconUA

+0

@ Clock_9 Come per definisce: se definisci qualcosa come '#define PRINT_THE_HELLO_DEFINES printf (" hello define! \ N ");' e 'void main() {PRINT_THE_HELLO_DEFINES}', allora il tuo codice sarà sostituito in questo modo: 'void main() {printf ("hello definisce! \ n"); } '. Quindi, le definizioni riguardano la sostituzione di cose. – FalconUA

2

Le variabili globali sono accessibili e modificabili da qualsiasi luogo. Le costanti #define non possono essere modificate, basta leggere.

Esempi:

  • Usiamo #define ERROR 666 per definire un programmatore pre compilazione costante di tempo per un errore per l'intero programma.

  • Utilizziamo una variabile globale per un conteggio del numero di operazioni eseguite da una funzione e questo valore può essere letto anche da altre funzioni.

Non ha senso per rendere l'errore come una variabile globale in quanto non deve essere modificato e non è possibile utilizzare la #define x come un contatore.

-4

#define è dichiarato in cima al codice, significa prima della dichiarazione della classe. E serve a definire (come dice il nome) una costante, che può essere letta ma non modificata.

Una variabile globale è accessibile a livello globale sul codice e allo stesso tempo cambiata.

+5

Non ci sono classi in C. – alk

+0

(Non so perché questo commento è stato eliminato) Una direttiva pre-processore come '# define' può essere messa su ogni riga di un file che è verrà inviato al pre-processore C. – alk

5

considerare questo piccolo esempio

#define num 5 
int number = 5; 

num è una macro e number è una variabile globale.

Una differenza importante è che num non è memorizzato nella memoria, num è solo il sostituto per 5, ma number utilizza memoria.

Inoltre, le macro sono direttive del preprocessore, i loro valori non possono essere modificati come variabili.

Quindi, non facendo

num = 6; 

più avanti nel codice. Dovrai utilizzare #undef per annullare la definizione e definirla nuovamente per modificare il valore.

+1

I macro possono essere ridefiniti (dopo che sono indefiniti usando la direttiva preprocessore '# undef'). – Peter

+0

Indovina non l'ho chiarito, grazie per aver avvisato @Peter. –

Problemi correlati