【问题标题】:sizeof- function or macro? [duplicate]sizeof-函数还是宏? [复制]
【发布时间】:2015-02-06 09:59:33
【问题描述】:

在 c 中,我们使用sizeof() 来获取数据类型的大小。所以 它是如何定义的。它是一个宏或一个函数。

因为我们可以将其用作两种方式,

sizeof int

和

sizeof(int)

所以这是如何在头文件中定义的。

【问题讨论】:

  • 两者都不是,它是一种语言结构。
  • 它是语言的一部分......这两者都不是。
  • sizeof 是一个运算符,而不是宏或函数。第一个变体sizeof int 只能用于类型。第二种变体可用于任意表达式。 sizeof 运算符也是仅编译时的功能,不会生成运行时代码。

标签: c sizeof


【解决方案1】:

两者都不是。它是一个内置运算符,其值在编译时计算,除非参数是可变长度数组的名称(在 C99 中添加)。

您经常看到的括号不是“调用”的一部分,因为sizeof 不是函数。它们是 参数 的一部分,仅当参数是强制转换表达式时才需要,即括号中的类型名称。

我个人建议反对尽可能使用带有类型名称的sizeof 作为参数,因为它通常不需要,并且会创建可能导致错误的断开/解耦。 p>

考虑这样的事情:

float *vector = malloc(100 * sizeof(double));

上面当然有一个bug:如果float小于double,会浪费很多内存。如果vector 最初是double 的数组,但后来更改为float,那么很容易想象会以上述方式结束。为了保护这一点,我总是写:

float *vector = malloc(10 * sizeof *vector);

上面使用参数*vector(float 类型的表达式)到sizeof,它不是类型名称,因此不需要括号。它还将元素的大小“锁定”到用于保存它的指针,这样更安全。

【讨论】:

    【解决方案2】:

    Sizeof 既不是宏也不是函数。它是一个在编译时计算的运算符。

    在预处理阶段评估的宏。

    正如@Yu Hao 指出的,可变长度数组是唯一的例外。

    为了更多的理解解决这个问题;

    #include<stdio.h>
        char func(char x)
        {
               x++;
               return x;
        }
    
        int main()
        {
               printf("%zu", sizeof(func(3))); 
                    return 0;
        }
    
        A) 1            B)2             C)3     D)4
    

    【讨论】:

    • 宏也在编译时被评估。
    • 可变长度数组是(唯一的)例外,sizeof VLA 在运行时进行评估。
    • 不要使用%d 来打印size_t 类型的值。使用%zu。
    • @unwind 现在改了。
    • @Vagish:我期待 sizeof 函数指针返回这里到底发生了什么?我必须如何将 sizeof 放到函数指针上?
    【解决方案3】:

    来自 ISO/IEC9899

    6.5.3.4 sizeof 运算符

    约束

    1 sizeof 运算符不得应用于具有函数类型或 不完整类型、此类类型的括号名称或表达式 指定位域成员。

    所以它既不是宏也不是函数。它是一个运算符!

    它的处理方式是编译器的事情。

    但是关于编译时间和运行时的确定标准说:

    语义

    2 sizeof 运算符产生其操作数的大小(以字节为单位),可能是 表达式或类型的括号名称。大小由类型决定 操作数。结果是一个整数。如果操作数的类型是变长数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量。

    因此,标准甚至规定,除了 VLA 情况外,它必须根据编译时间确定。

    【讨论】:

      【解决方案4】:

      语法

      1. sizeof(类型)
      2. 表达式列表大小

      两个版本都返回 std::size_t 类型的常量。

      说明

      1. 返回类型对象表示的字节大小。
      2. 返回类型的对象表示的字节大小,即 如果评估,将由表达式返回。

      【讨论】:

        【解决方案5】:

        一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。

        在许多程序中,在某些情况下了解特定数据类型的大小很有用(最常见的例子之一是使用库函数 malloc 进行动态内存分配)。尽管对于 C 或 C++ 的任何给定实现,特定数据类型的大小是恒定的,但 C 和 C++ 中甚至原始类型的大小都是实现定义的(即,标准未精确定义)。当尝试分配适当大小的内存块时,这可能会导致问题。例如,假设程序员想要分配一块足够大的内存来容纳十个 int 类型的变量。因为我们假设的程序员不知道 int 类型的确切大小,所以程序员不知道要向 malloc 请求多少字节。因此,有必要使用sizeof:

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 2021-04-27
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2020-11-22
          • 2019-02-12
          相关资源
          最近更新 更多