sizeof-功能还是宏?

时间:2015-02-06 09:59:34

标签: c sizeof

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

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

sizeof int

sizeof(int)

所以如何在头文件中定义它。

5 个答案:

答案 0 :(得分:5)

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

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

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

考虑这样的事情:

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

上述内容当然包含一个错误:如果float小于double,则会浪费大量内存。如果vectordouble的数组开头但后来更改为float,则很容易想象最终会出现上述内容。为了保护这个,我总是这样写:

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

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

答案 1 :(得分:4)

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

在预处理阶段评估的宏。

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

For More Understanding解决这个问题;

#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

答案 2 :(得分:2)

来自ISO / IEC9899

  

6.5.3.4 sizeof运算符

     

约束

     

1 sizeof运算符不应用于具有函数类型的表达式   不完整的类型,这种类型的括号名称,或表达式   指定一个位字段成员。

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

以及它的处理方式是编译器。

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

  

语义

     

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

因此,除了VLA案例之外,它甚至可以在编译时确定。

答案 3 :(得分:0)

<强>语法

  1. sizeof(type)
  2. 列出表达式大小
  3. 两个版本都返回std :: size_t类型的常量。

    <强>解释

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

答案 4 :(得分:0)

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

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