#define值的大小

时间:2010-07-07 18:57:40

标签: c++ c-preprocessor

如果某个值定义为

#define M_40 40

大小是否与short(2个字节)相同,还是char(1个字节)或int(4个字节)?

大小取决于您是32位还是64位?

5 个答案:

答案 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 ++的变化可能不会太大。