首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ANSI C中使用sizeof ()查找函数类型长度

在ANSI C中使用sizeof ()查找函数类型长度
EN

Stack Overflow用户
提问于 2013-09-24 18:09:52
回答 5查看 2.1K关注 0票数 0

当我需要找到函数类型长度时,我习惯于使用sizeof ()来完成它。

预期的结果是4字节和8字节,但现在,通过GCC,结果是1字节。

为什么输出是1字节,而不是4字节和8字节?

代码语言:javascript
复制
#include <stdio.h>

int foo (); 
double bar (); 

int 
main (void)
{
    printf ("int foo () %lu\n", sizeof (foo));  
    printf ("double bar () %lu\n", sizeof (bar));
}

double 
bar (void)
{
    return 1.1;
}

int
foo (void)
{
    return 0;
}               
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-24 18:16:19

尽管标准规定“sizeof运算符不应应用于具有函数类型的表达式”(§6.5.3.4/1),但在GNU中,这样做的结果定义得很好:

在void和函数类型上也允许"__sizeof ,并返回1"。 ~ GCC,6.23关于虚指针和函数指针的算法

还请看一下:为什么C中函数的大小总是1字节?

票数 0
EN

Stack Overflow用户

发布于 2013-09-24 18:14:20

在功能类型上不得使用sizeof操作符,这是ISO/IEC标准明确禁止的。因此返回的值没有任何意义。

参考ISO/IEC 9899:201x§6.5.3.4

sizeof运算符不应应用于具有函数类型或不完全类型的表达式、此类类型的括号大小的名称或指定位字段成员的表达式。

我想启用-pedantic标志应该会引发一个警告。

票数 3
EN

Stack Overflow用户

发布于 2013-09-24 18:14:21

您正在尝试查找函数本身的大小,而不是它的返回值。为了找到返回值的类型,您需要添加一对括号来告诉编译器您需要函数调用表达式的类型,如下所示:

代码语言:javascript
复制
printf ("int foo () %lu\n", sizeof (foo()));  
printf ("double bar () %lu\n", sizeof (bar()));

注意,函数不会被调用:它们的返回类型的大小将在编译时计算出来。

关于理想的演示

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

https://stackoverflow.com/questions/18988920

复制
相关文章

相似问题

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