【问题标题】:Why does sizeof(MACRO) give an output of 4 bytes when MACRO does not hold any memory location?为什么当 MACRO 不保存任何内存位置时 sizeof(MACRO) 会给出 4 个字节的输出?
【发布时间】:2018-05-14 15:03:17
【问题描述】:

下面是小程序:

#include <stdio.h>
#define max 'A'

int main()
{
    char a;
    printf("max[%d] sizeof[max][%ld]\n", max, sizeof(max));
    a = max;
    printf("a[%d] sizeof[a][%ld]\n", a, sizeof(a));
    return 0;
}

而程序的输出是:

max[65] sizeof[max][4]
a[65] sizeof[a][1]

谁能帮我理解为什么 sizeof(max) 是 4 个字节?

【问题讨论】:

  • 请记住,宏是在编译之前发生的文本替换。所以编译器看到sizeof('A'),这是一个有意义的表达式。
  • 由于sizeof() 返回一个size_t 类型的值,最好使用匹配的打印说明符,如"%zu" 而不是"%ld"

标签: c macros c-preprocessor


【解决方案1】:

sizeof(max) 被预处理器替换为sizeof('A')sizeof('A')sizeof(int)相同,后者在你的平台上是4。

为免生疑问,'A' 是 C 中的 int 常量不是 char。 (请注意,在 C++ 中,'A'char literal,而 sizeof(char) 按照标准固定为 1。)

【讨论】:

  • 为避免疑问,sizeof(char)==1 按定义 在 C 和 C++ 中,IIRC 令牌的正式名称 'A' 在两者中都是“字符文字”语言,以及。但是表达式 'A'type 在 C 中是 int,在 C++ 中是 char
  • @zwol 在 C 中是 字符常量。 “literal”一词仅在 C 标准中用于“string literal”和“compound literal”。
猜你喜欢
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2023-04-09
相关资源
最近更新 更多