Я начал изучать C и не мог четко понять различия между макросами и постоянными переменными.
Что меняется при записи,
#define A 8
и
const int A = 8
?
Ответ 1
Макросы обрабатываются предварительным процессором - предварительный процессор выполняет замену текста в исходном файле, заменяя все события "A" на букву 8.
Константы обрабатываются компилятором. Они имеют дополнительное преимущество безопасности типов.
Для реального скомпилированного кода, с любым современным компилятором, должна быть нулевая разница в производительности между ними.
Ответ 2
Макроопределенные константы заменяются препроцессором. Константные переменные управляются точно так же, как и обычные переменные.
Например, следующий код:
#define A 8
int b = A + 10;
Явился бы фактическому компилятору как
int b = 8 + 10;
Однако этот код:
const int A = 8;
int b = A + 10;
Появится как:
const int A = 8;
int b = A + 10;
:)
На практике главное, что изменения - это область: постоянные переменные подчиняются тем же правилам определения, что и стандартные переменные в C, что означает, что они могут быть ограничены или, возможно, переопределены в определенном блоке, без его утечки - это похоже к ситуации локальных и глобальных переменных.
Ответ 3
В C вы можете написать
#define A 8
int arr[A];
но не:
const int A = 8;
int arr[A];
если я правильно помню правила. Обратите внимание, что на C++ оба будут работать.
Ответ 4
Во-первых, первый приведет к тому, что препроцессор заменит все вхождения A на 8, прежде чем компилятор что-нибудь сделает, а второй не будет включать препроцессор