Если значение определено как
#define M_40 40
Является ли размер те же, что и short
(2 байта), или он как char
(1 байт) или int
(4 байта)?
Является ли размер зависимым от того, являетесь ли вы 32-разрядной или 64-разрядной?
Если значение определено как
#define M_40 40
Является ли размер те же, что и short
(2 байта), или он как char
(1 байт) или int
(4 байта)?
Является ли размер зависимым от того, являетесь ли вы 32-разрядной или 64-разрядной?
#define
не имеет размера, поскольку это не тип, а простая замена текста в ваш код на С++. #define
- это предпроцессорная директива, и она запускается до того, как ваш код даже начнет компилироваться.
Размер в коде С++ после подстановки - это какой бы размер не был выражен на С++ или кодексе. Например, если вы суффикс с L
как 102L
, тогда он будет выглядеть длинным, в противном случае без суффикса, просто int. Таким образом, возможно, 4 байта на x86 и x64, но это зависит от компилятора.
Возможно, стандартный литеральный текст Integer С++ очистит его для вас (раздел 2.13.1-2 стандарта С++ 03):
Тип целочисленного литерала зависит по его форме, значению и суффиксу. Если оно является десятичной и не имеет суффикса, она имеет первый из этих типов, в котором значение может быть представлено: int, long INT; если значение не может быть представленный как длинный int, поведение undefined. Если он восьмеричный или шестнадцатеричный и не имеет суффикса, это имеет первый из этих типов, в котором его значение может быть представлено: int, unsigned int, long int, unsigned long внутр. Если он суффикс u или U, его тип - первый из этих типов в который может быть представлен: unsigned int, unsigned long int. Если оно суффикс l или L, его тип - это первый из этих типов, в котором значение может быть представлено: long int, unsigned long int. Если он суффикс по ul, lu, uL, Lu, Ul, lU, UL или LU, его тип unsigned long int
Простое целое будет неявным образом отбрасываться на int
во всех вычислениях и присваиваниях.
#define
просто сообщает препроцессору заменить все ссылки на символ чем-то другим. Это то же самое, что и глобальная находка-замена на вашем коде и замена M_40
на 40
.
Значение #define не имеет размера, в частности. Это просто замена текста. Это зависит от контекста того, где (и что) подставляется.
В вашем примере, где вы используете M_40
, компилятор увидит 40
и обычно обрабатывает его как в int
.
Однако, если бы мы имели:
void SomeFunc(long);
SomeFunc(M_40);
Он будет рассматриваться как длинный.
Макросы препроцессора буквально меняются местами на этапе препроцесса компиляции.
Например, код
#define N 5
int value = N;
будет заменен на
int value = 5;
когда компилятор видит это. Он не имеет собственного размера как такового
Препроцессор просто выполняет простую замену текста, поэтому факт, что ваша константа находится в #define
, не имеет значения. Весь стандарт C говорит, что "каждая константа должна иметь тип, а значение константы должно быть в диапазоне представляемых значений для своего типа". С++, вероятно, не будет слишком сильно отличаться от этого.