如果某个值定义为
#define M_40 40
大小是否与short
(2个字节)相同,还是char
(1个字节)或int
(4个字节)?
大小取决于您是32位还是64位?
答案 0 :(得分:31)
#define
没有大小,因为它不是类型,而是纯文本替换到C ++代码中。 #define
是一个预处理指令,它在您的代码开始编译之前运行。
替换后C ++代码中的大小与您在那里使用的C ++表达式或代码的大小无关。例如,如果后缀为L
,如102L
,那么它看起来很长,否则没有后缀,只是一个int。因此x86和x64上可能有4个字节,但这取决于编译器。
也许C ++标准的Integer文字部分将为您清除它(C ++ 03标准的第2.13.1-2节):
整数文字的类型取决于 在它的形式,价值和后缀。如果它 是十进制的,没有后缀,它有 它的第一种类型 value可以表示为:int,long INT;如果价值不能 表示为长整数, 行为未定义。如果是八进制 或十六进制,没有后缀,它 有这些类型中的第一种 它的值可以表示为:int, unsigned int,long int,unsigned long INT。如果它以u或U为后缀,则为 type是这些类型中的第一个 它的价值可以代表: unsigned int,unsigned long int。如果它 以l或L为后缀,其类型为 其中的第一种类型 值可以表示为:long int, unsigned long int。如果是后缀 by ul,lu,uL,Lu,Ul,lU,UL或LU, 它的类型是unsigned long int
答案 1 :(得分:7)
在所有计算和赋值中,普通整数将隐式转换为int
。
#define
只是告诉预处理器用其他东西替换对符号的所有引用。这与在代码上执行全局查找替换并将M_40
替换为40
相同。
答案 2 :(得分:2)
#define值没有特定的大小。这只是文字替换。这取决于被替换的位置(和什么)的背景。
在您使用M_40
的示例中,编译将显示40
,并且通常将其视为int
。
但是,如果我们有:
void SomeFunc(long);
SomeFunc(M_40);
它将被视为一个长期。
答案 3 :(得分:2)
预处理器宏在编译的预处理阶段进行字面交换。
例如代码
#define N 5
int value = N;
将被换成
int value = 5;
当编译器看到它时。它没有自己的大小
答案 4 :(得分:1)
预处理器只进行简单的文本替换,因此你的常量在#define
中并不重要。所有C标准都说“每个常数都有一个类型,常量的值应该在其类型的可表示值范围内。” C ++的变化可能不会太大。