Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ANSIC中使用sizeof()查找函数类型长度_C_Sizeof - Fatal编程技术网

在ANSIC中使用sizeof()查找函数类型长度

在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 (

当我需要查找函数类型长度时,我使用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;
}               
#包括
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标准允许此类扩展,但符合要求的编译器仍必须进行诊断。)