在ANSIC中使用sizeof()查找函数类型长度
当我需要查找函数类型长度时,我使用sizeof()来完成 预期的结果是4字节和8字节,但现在,通过GCC得到的结果是1字节 为什么输出是1字节,而不是4字节和8字节在ANSIC中使用sizeof()查找函数类型长度,c,sizeof,C,Sizeof,当我需要查找函数类型长度时,我使用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 (
#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;
}
#包括
intfoo();
双杠();
int
主(空)
{
printf(“intfoo()%lu\n”,sizeof(foo));
printf(“双条()%lu\n”,大小(条));
}
双重的
酒吧(空)
{
返回1.1;
}
int
富(无效)
{
返回0;
}
sizeof
运算符不得用于功能类型,这是ISO/IEC C标准明确禁止的。所以返回的值没有意义
参考ISO/IEC 9899:201x§6.5.3.4
sizeof
运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式
我想启用
-pedantic
标志应该会发出警告。sizeof
运算符不应用于函数类型,这是ISO/IEC C标准明确禁止的。所以返回的值没有意义
参考ISO/IEC 9899:201x§6.5.3.4
sizeof
运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式
我想启用
-pedantic
标志应该会发出警告。您试图查找函数本身的大小,而不是其返回值。为了找到返回值的类型,您需要添加一对括号来告诉编译器您需要函数调用表达式的类型,如下所示:
printf ("int foo () %lu\n", sizeof (foo()));
printf ("double bar () %lu\n", sizeof (bar()));
请注意,不会调用这些函数:它们的返回类型的sizeof将在编译时计算出来
.您试图查找函数本身的大小,而不是其返回值。为了找到返回值的类型,您需要添加一对括号来告诉编译器您需要函数调用表达式的类型,如下所示:
printf ("int foo () %lu\n", sizeof (foo()));
printf ("double bar () %lu\n", sizeof (bar()));
请注意,不会调用这些函数:它们的返回类型的sizeof将在编译时计算出来
.sizeof不应应用于具有函数类型的变量。所以,你看到的基本上是一种未定义的行为。理想情况下,编译器应该对此进行投诉。sizeof不应应用于具有函数类型的变量。所以,你看到的基本上是一种未定义的行为。理想情况下,编译器应该对此进行投诉。尽管标准规定“不应将
sizeof
运算符应用于具有函数类型的表达式”(§6.5.3.4/1),但在GNU C中,这样做的结果定义良好:
“sizeof
也可用于void和函数类型,并返回1”~
另请看:尽管标准规定“不应将
sizeof
运算符应用于具有函数类型的表达式”(§6.5.3.4/1),但在GNU C中,这样做的结果定义良好:
“sizeof
也可用于void和函数类型,并返回1”~
还要看一看:对函数名应用
sizeof
是一种违反约束的行为,需要任何符合条件的编译器进行诊断。默认情况下,gcc不符合要求,但可以使用正确的命令行选项(几乎)使其符合要求,例如:
gcc -std=c99 -pedantic
(如果愿意,将c99
替换为c90
或c11
)
gcc有一个扩展,允许对void*
和函数指针进行指针运算。(ISO标准允许这种扩展,但符合标准的编译器仍必须诊断任何违反约束的情况。)例如,向函数指针添加1会使其提前1个字节
不幸的是,IMHO,gcc开发人员选择通过提供函数和void
类型1来实现这一点。指针算法的行为就是这样,但它的缺点是,计算函数或空表达式大小的尝试不会被拒绝
标准C未提供确定函数大小的方法;它甚至没有讨论这样一个概念。据我所知,gcc没有提供这样做的扩展sizeof func
生成一个虚构的值1,与函数的代码大小无关
您始终可以确定函数指针的大小,通常为4或8字节,但这当然不是函数本身的大小。您不能通过对函数名应用sizeof
来实现这一点
如果一个C程序可以获得一个函数的大小(大概是实现它的代码的大小),我想不出它除了显示信息之外还能做什么有用的事情。如果这是您要查找的信息,则可以检查程序集列表或对象文件。例如,在类Unix系统上,
nmfoo.o
的输出显示每个函数的地址;这通常可以告诉您每个函数的代码大小(最后一个函数除外)。这都是非常特定于系统的。对函数名应用sizeof
是违反约束的行为,需要任何符合条件的编译器进行诊断。默认情况下,gcc不符合要求,但可以使用正确的命令行选项(几乎)使其符合要求,例如:
gcc -std=c99 -pedantic
(如果愿意,将c99
替换为c90
或c11
)
gcc有一个扩展,允许对void*
和函数指针进行指针运算。(ISO标准允许此类扩展,但符合要求的编译器仍必须进行诊断。)