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

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

#define M_40 40

Размер то же как a short (2 байта) или являются этим как a char (1 байт) или int (4 байта)?

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

10
задан Brian Tompsett - 汤莱恩 27 November 2015 в 16:56
поделиться

5 ответов

#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

32
ответ дан 3 December 2019 в 13:36
поделиться

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

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

#define N 5

int value = N;

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

int value = 5;

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

2
ответ дан 3 December 2019 в 13:36
поделиться

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

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

7
ответ дан 3 December 2019 в 13:36
поделиться

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

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

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

void SomeFunc(long);

SomeFunc(M_40);

Это будет считаться длинным.

2
ответ дан 3 December 2019 в 13:36
поделиться

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

1
ответ дан 3 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: