В чем разница между глобальными переменными и #define в c
в чем причина, почему есть 2 возможности:
- глобальные переменные
- символьные константы с
#define
?
Так что я знаю, что #define
делает, но я не знаю, в чем разница в использовании.
Какая ситуация должна быть у меня, чтобы я мог сам решить, какая возможность мне нужна? Что одна из возможностей может сделать то, чего не делает другая ? Я надеюсь, что смогу прояснить, что я имею в виду.
4 ответов
ну, глобальные переменные можно редактировать отовсюду.
в основном, на низком уровне переменная хранится в оперативной памяти и создается после запуска вашего приложения, она всегда имеет адрес в оперативной памяти. Defines - это просто макросы, ваш компилятор просто заменит ваши имена define своими значениями на шаге компиляции.
#define
нельзя редактировать, это просто макросы. И #define
не только о значениях, вы можете определить почти все, что вы хотите, для пример:
// 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;
и в большинстве ситуаций defines используются для установки некоторых значений, специфичных для ОС или оборудования. Это действительно мощная вещь, потому что она дает вам возможность динамически изменять вещи на этапе компиляции. Например:
// 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
рассмотрим этот небольшой пример
#define num 5
int number = 5;
num
макрос и number
- это глобальная переменная.
одним важным отличием является то, что num
не хранится в памяти,num
это просто замена для 5, но number
использует память.
кроме того, макросы являются директивами препроцессора,их значения не могут быть изменены как переменные.
итак, не делать
num = 6;
позже в коде. Вам придется использовать #undef
к undefine это и определить его снова, чтобы изменить значение.
глобальные переменные могут быть доступны и отредактированы отовсюду. #определить константы нельзя редактировать, просто прочитайте.
примеры:
мы используем:
#define ERROR 666
определить программист предварительной компиляции постоянная ошибка за всю программу.мы используем глобальную переменную для подсчета количества операций, выполненных функцией, и это значение может быть прочитано другими функциями.
нет смысла сделайте ошибку глобальной переменной, так как она не должна редактироваться, и вы не можете использовать #define x
как счетчик.
#define
объявляется поверх кода, это означает, что перед объявлением класса. И он служит для определения (как говорится в названии) константы, которую можно читать, но не изменять.
глобальная переменная может быть доступна глобально в коде и в то же время изменена.