当我需要找到函数类型长度时,我习惯于使用sizeof ()来完成它。
预期的结果是4字节和8字节,但现在,通过GCC,结果是1字节。
为什么输出是1字节,而不是4字节和8字节?
#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;
} 发布于 2013-09-24 18:16:19
尽管标准规定“sizeof运算符不应应用于具有函数类型的表达式”(§6.5.3.4/1),但在GNU中,这样做的结果定义得很好:
在void和函数类型上也允许"__
sizeof,并返回1"。 ~ GCC,6.23关于虚指针和函数指针的算法
还请看一下:为什么C中函数的大小总是1字节?
发布于 2013-09-24 18:14:20
在功能类型上不得使用sizeof操作符,这是ISO/IEC标准明确禁止的。因此返回的值没有任何意义。
参考ISO/IEC 9899:201x§6.5.3.4
sizeof运算符不应应用于具有函数类型或不完全类型的表达式、此类类型的括号大小的名称或指定位字段成员的表达式。
我想启用-pedantic标志应该会引发一个警告。
发布于 2013-09-24 18:14:21
您正在尝试查找函数本身的大小,而不是它的返回值。为了找到返回值的类型,您需要添加一对括号来告诉编译器您需要函数调用表达式的类型,如下所示:
printf ("int foo () %lu\n", sizeof (foo()));
printf ("double bar () %lu\n", sizeof (bar()));注意,函数不会被调用:它们的返回类型的大小将在编译时计算出来。
关于理想的演示。
https://stackoverflow.com/questions/18988920
复制相似问题