В чем разница между макроконстантами и постоянными переменными в C?

Возможный дубликат:
"static const" vs "#define" в C

Я начал изучать 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, прежде чем компилятор что-нибудь сделает, а второй не будет включать препроцессор