Если значение определяется как
#define M_40 40
Размер то же как a short
(2 байта) или являются этим как a char
(1 байт) или int
(4 байта)?
Действительно ли размер зависит от того, являетесь ли Вы 32-разрядными или 64-разрядными?
#define
не имеет размера, так как это не тип, а подстановка обычного текста в ваш C++ код. #define
является директивой препроцессирования и выполняется еще до того, как ваш код начинает компилироваться.
Размер в коде C++ после подстановки равен размеру того выражения или кода C++, который у вас там есть. Например, если вы добавите суффикс L
, например 102L
, то это будет восприниматься как long, иначе, без суффикса, просто int. Так что 4 байта на x86 и x64 возможно, но это зависит от компилятора.
Возможно, раздел целочисленного литерала стандарта C++ прояснит вам ситуацию (раздел 2.13.1-2 стандарта C++03):
Тип целочисленного литерала зависит от его формы, значения и суффикса. Если он десятичный и не имеет суффикса, он имеет первый из этих типов, в которых его значение может быть представлено: int, long int; если значение не может быть представить в виде long int, то поведение не определено. Если значение восьмеричное или шестнадцатеричное и не имеет суффикса, оно имеет первый из этих типов, в котором его значение может быть представлено: int, unsigned int, long int, unsigned long int. Если он имеет суффикс 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
Макросы препроцессора буквально подменяются на этапе препроцесса компиляции.
Например, код
#define N 5
int value = N;
будет заменен на
int value = 5;
когда компилятор увидит его. Он не имеет собственного размера как такового
Простое целое число будет неявно приведено к int
во всех вычислениях и присвоениях.
#define
просто указывает препроцессору заменить все ссылки на символ чем-то другим. Это то же самое, что выполнить глобальный поиск-замену в вашем коде и заменить M_40
на 40
.
Значение #define, в частности, не имеет размера. Это просто подмена текста. Это зависит от контекста того, где (и что) заменяется.
В вашем примере, где вы используете M_40
, компиляция увидит 40
и обычно обрабатывает его, как в int
.
Однако, если бы у нас было:
void SomeFunc(long);
SomeFunc(M_40);
Это будет считаться длинным.
Препроцессор просто выполняет простую замену текста, поэтому тот факт, что ваша константа находится в #define
, не имеет значения. Стандарт C говорит только о том, что «Каждая константа должна иметь тип, а значение константы должно находиться в диапазоне представимых значений для этого типа». C ++, скорее всего, не будет слишком сильно отличаться от этого.