2015-05-02 18 views
5

Co powód dlaczego tam są 2 możliwości:Jaka jest różnica między zmiennych globalnych i #define w C

  1. zmienne globalne
  2. symboliczne stałe z #define?

Więc wiem, co robi #define, ale nie wiem, jaka jest różnica w użyciu. Jaką sytuację muszę mieć, więc mogę zdecydować się na odpowiednią okazję? Co jest jedną z możliwości, które są w stanie zrobić to, czego nie robi druga? Mam nadzieję, że mogę wyjaśnić, co mam na myśli.

+0

Globalne zmienne są dostępne i edytowane zewsząd. Stałe #define nie mogą być edytowane, po prostu czytaj. Ma to związek z bezpieczeństwem wątków i ponownym wejściem w funkcje. – shinzou

+0

"* Wiem, co robi #define" "Jasne? ;-) Jednak przeczytanie tego https://gcc.gnu.org/onlinedocs/cpp/ może pomóc uzyskać oświecenie. – alk

+0

Zmienna 'global' jest zmienną, możesz zmienić jej wartość, chyba że ustawisz ją jako' const', '# define' to stała wartość. Nie można go w ogóle zmienić. –

Odpowiedz

4

Cóż, zmienne globalne można edytować zewsząd.

Zasadniczo na niskim poziomie zmienna jest przechowywana w pamięci RAM i tworzona po uruchomieniu aplikacji, zawsze ma adres w pamięci RAM. Definicje to tylko makra, twój kompilator po prostu zastąpi zdefiniowane nazwy swoimi wartościami w kroku kompilacji.

#define nie można edytować, to tylko makra. I #define nie chodzi tylko o wartości, można zdefiniować prawie wszystko, co chcesz, na przykład:

// 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; 

i, w większości przypadków, definiuje służą do ustawiania niektórych wartości OS-specyficzny lub specyficzne dla sprzętu. To naprawdę potężna rzecz, ponieważ daje możliwość dynamicznej zmiany rzeczy na etapie kompilacji. Na przykład:

// 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

jedyną różnicą pomiędzy stałą zmienną globalną a makrem jest pamięć (stała zmienna globalna jest przechowywana w pamięci, a makro nie), nieprawdaż? –

+0

@ Clock_9 Tak, to jedna z różnic, ale nie jedyny. Nie można zapisać kodu w zmiennej porządkowej i nie można wykonywać niektórych zmiennych specyficznych dla systemu ze zmiennymi. – FalconUA

+0

@ Clock_9 Jeśli chodzi o definicje: jeśli zdefiniujesz coś takiego jak '#define PRINT_THE_HELLO_DEFINES printf (" hello definiuje! \ N ");' i 'void main() {PRINT_THE_HELLO_DEFINES}', twój kod zostanie zastąpiony w następujący sposób: 'void main() {printf ("hello definiuje! \ n"); } '. Tak więc definiuje się zamiany rzeczy. – FalconUA

2

Globalne zmienne mogą być dostępne i edytowane zewsząd. Stałe #define nie mogą być edytowane, po prostu czytaj.

Przykłady:

  • Używamy #define ERROR 666 zdefiniować programista pre kompilacji stałą dla błędu dla całego programu.

  • Używamy zmiennej globalnej do zliczania liczby operacji wykonywanych przez funkcję i ta wartość może być również odczytana przez inne funkcje.

Nie ma sensu, aby ten błąd jako zmienną globalną, gdyż nie powinny być edytowane i nie można użyć #define x jako licznik.

-4

#define jest zadeklarowany na górze kodu, to znaczy przed deklaracją klasy. I służy do zdefiniowania (jak sama nazwa wskazuje) stałej, którą można odczytać, ale nie zmienić.

Globalna zmienna może być dostępna globalnie na kodzie, a jednocześnie zmieniona.

+5

Brak klas w C. – alk

+0

(Nie wiem, dlaczego ten komentarz został usunięty) Dyrektywa preprocesora taka jak "# define" może być umieszczona w każdym wierszu pliku, który jest zostanie podany do pre-procesora C. – alk

5

rozważyć ten mały przykład

#define num 5 
int number = 5; 

num to makro i number jest zmienną globalną.

Jedną ważną różnicą jest to, że num nie jest zapisany w pamięci, num jest tylko substytutem dla 5, ale number wykorzystuje pamięć.

Makra są także dyrektywami preprocesora, ich wartości nie można zmienić jak zmiennych.

Więc nie robi

num = 6; 

później w kodzie. Będziesz musiał użyć #undef, aby to zmienić i zdefiniować ponownie, aby zmienić wartość.

+1

Makra można ponownie zdefiniować (po tym, jak są niezdefiniowane za pomocą dyrektywy preprocesora # # undef') – Peter

+0

Zgadnij, że nie wyjaśniłem, dzięki za powiadomienie @Peter. –

Powiązane problemy