Размер значений #define

Если значение определено как

#define M_40 40

Является ли размер те же, что и short (2 байта), или он как char (1 байт) или int (4 байта)?

Является ли размер зависимым от того, являетесь ли вы 32-разрядной или 64-разрядной?

Ответ 1

#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

Ответ 2

Простое целое будет неявным образом отбрасываться на int во всех вычислениях и присваиваниях.

#define просто сообщает препроцессору заменить все ссылки на символ чем-то другим. Это то же самое, что и глобальная находка-замена на вашем коде и замена M_40 на 40.

Ответ 3

Значение #define не имеет размера, в частности. Это просто замена текста. Это зависит от контекста того, где (и что) подставляется.

В вашем примере, где вы используете M_40, компилятор увидит 40 и обычно обрабатывает его как в int.

Однако, если бы мы имели:

void SomeFunc(long);

SomeFunc(M_40);

Он будет рассматриваться как длинный.

Ответ 4

Макросы препроцессора буквально меняются местами на этапе препроцесса компиляции.

Например, код

#define N 5

int value = N;

будет заменен на

int value = 5;

когда компилятор видит это. Он не имеет собственного размера как такового

Ответ 5

Препроцессор просто выполняет простую замену текста, поэтому факт, что ваша константа находится в #define, не имеет значения. Весь стандарт C говорит, что "каждая константа должна иметь тип, а значение константы должно быть в диапазоне представляемых значений для своего типа". С++, вероятно, не будет слишком сильно отличаться от этого.