Размер #define значений - PullRequest
10 голосов
/ 07 июля 2010

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

#define M_40 40

Размер совпадает с short (2 байта) или char (1 байт) или int (4 байта)?

Зависит ли размер от того, 32-битный вы или 64-битный?

Ответы [ 5 ]

32 голосов
/ 07 июля 2010

#define не имеет размера, поскольку это не тип, а подстановка простого текста в ваш код C ++.#define - это директива предварительной обработки, которая запускается до того, как ваш код даже начинает компилироваться.

Размер кода C ++ после подстановки равен размеру того, что у вас есть в C ++ выражении или коде.Например, если вы суффиксом L, как 102L, то он видится как long, иначе без суффикса, просто int.Так что 4 байта на x86 и x64, вероятно, но это зависит от компилятора.

Возможно, литеральный раздел Integer стандарта 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, его тип - без знака long int

7 голосов
/ 07 июля 2010

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

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

2 голосов
/ 07 июля 2010

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

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

#define N 5

int value = N;

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

int value = 5;

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

2 голосов
/ 07 июля 2010

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

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

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

void SomeFunc(long);

SomeFunc(M_40);

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

1 голос
/ 07 июля 2010

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

...