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