首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >功能大小还是宏观功能?

功能大小还是宏观功能?
EN

Stack Overflow用户
提问于 2015-02-06 09:59:33
回答 5查看 8.5K关注 0票数 3

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

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

代码语言:javascript
复制
sizeof int

代码语言:javascript
复制
sizeof(int)

那么这是如何在头文件中定义的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-06 10:22:32

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

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

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

考虑一下这样的事情:

代码语言:javascript
复制
float *vector = malloc(100 * sizeof(double));

当然,上面的代码包含一个bug:如果float小于double,那么它将浪费大量内存。如果vector最初是一个double数组,但后来被更改为float,那么很容易想象会出现类似上述情况的结果。为了保护这一点,我总是写道:

代码语言:javascript
复制
float *vector = malloc(10 * sizeof *vector);

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

票数 7
EN

Stack Overflow用户

发布于 2015-02-06 10:01:14

Sizeof既不是宏,也不是function.Its,它是在编译时计算的操作符。

宏在pr处理阶段进行评估。

正如余浩指出的那样,可变长度数组是唯一的例外。

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

代码语言:javascript
复制
#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
票数 4
EN

Stack Overflow用户

发布于 2015-02-06 10:04:21

调自ISO/ISO 9899

6.5.3.4规模较大的经营者 约束条件 1不应对具有函数类型或不完全类型的表达式、此类类型的括号大小名称或指定位字段成员的表达式应用sizeof of运算符。

因此,它既不是宏,也不是function.Its,不是运算符!

它的处理方式是编译器的一部分。

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

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

因此,除了VLA的情况外,还可以根据编译时间来确定它的标准。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28363064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档