Я хотел бы знать, как память выделяется для переменных #define в C.
#define VAR1 10
у меня 2 вопроса...
- Какой тип VAR1?
- В каком сегменте памяти хранится VAR1?
Я хотел бы знать, как память выделяется для переменных #define в C.
#define VAR1 10
у меня 2 вопроса...
#
), или он может быть включен в идентификатор макросом, использующим вставку токена (оператор ##
).) 07.07.2015 VAR1
не имеет ни типа, ни представления во время выполнения. Он распознается только препроцессором.
Итак, ответ Mu_(negative)">Mu: на ваш вопрос нельзя ответить, поскольку он основан на неверных предположениях.
В каком сегменте памяти хранится VAR1?
Ни в одном сегменте.
VAR1
имеет значение только на этапе предварительной обработки и не имеет никакой идентификации во время выполнения. Во время предварительной обработки все экземпляры VAR1
заменяются на 10
, поэтому во время выполнения не требуется памяти, поскольку 10
является целочисленным литералом.
Какой тип VAR1?
VAR1
заменяется на 10
на этапе предварительной обработки. 10
, являясь integer literal
, мы можем сказать тип или VAR1
это int
.
Мораль: макросы — это не переменные.
Насколько я понимаю, определение через макрос не имеет ни типа, ни явного выделения памяти; правая часть определения (в данном случае 10
) текстуально расширяется до любого вхождения левой части (в данном случае VAR1
) перед компиляцией.
Macros
есть not variables
. Это просто общее имя для некоторого значения. В вашем случае VAR1
соответствует integer
значению 10
.
Макрос нигде в памяти не хранится. Когда мы компилируем программу на C или C++, это делается в несколько этапов. Сначала проверяется синтаксис. Если синтаксис правильный, он проверяется на семантические ошибки. Если он проходит тогда, файл программы .c
преобразуется в Object code
. Во время этого преобразования обрабатываются препроцессоры, т.е. включаются заголовочные файлы, любой внешний связанный файл и all the macro are replaced with their corresponding values
(в вашем случае, в любом месте, где программа найдет VAR1
, она заменит его значением 10
).
После этой фазы весь код уже был преобразован почти в код машинного уровня.
Надеюсь, вы получили ответ.
VAR1
, остальная часть этого ответа очень неточна, чтобы не сказать неправильно. 26.04.2016