В чем разница между глобальными переменными и #define в c

в чем причина, почему есть 2 возможности:

  1. глобальные переменные
  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 объявляется поверх кода, это означает, что перед объявлением класса. И он служит для определения (как говорится в названии) константы, которую можно читать, но не изменять.

глобальная переменная может быть доступна глобально в коде и в то же время изменена.