sizeof-函数还是宏?

sizeof- function or macro?

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

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

sizeof int

sizeof(int)

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

Sizeof 既不是宏也不是 function.Its 在编译时计算的运算符。

在 pr 处理阶段评估的宏。

正如@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

语法

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

两个版本 return 类型常量 std::size_t。

说明

  1. returns 类型对象表示的字节大小。
  2. returns 类型对象表示的字节大小,即 如果计算,将被 return 表达式编辑。

来自ISO/IEC9899

6.5.3.4 The sizeof operator

Constraints

1 The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member.

所以它既不是宏也不是function.Its运算符!

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

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

Semantics

2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

所以标准甚至规定必须在编译时确定,VLA 情况除外。

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

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

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

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

我个人建议 against 尽可能使用 sizeof 和类型名称作为参数,因为通常不需要它,并创建一个 disconnect/de-coupling可能会导致错误。

考虑这样的事情:

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

上面当然有一个bug:如果float小于double,会浪费很多内存。如果 vector 最初是 double 的数组但后来更改为 float,那么很容易想象得到类似上面的结果。为了防止这种情况,我总是写:

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

上面使用参数*vector(类型float的表达式)到sizeof,这是不是类型名称所以不需要括号。它还"locks"元素的大小到用来保存它的指针,这样更安全。