为什么C中函数的大小总是1个字节?

当我们使用sizeof()检查函数的大小时,我们总是得到1个字节。这个1字节表示什么?

user1645461 asked 2019-09-11T08:46:09Z
4个解决方案
80 votes

这是违反约束的行为,您的编译器应该对其进行诊断。 如果它尽管如此编译它,你的程序有不确定的行为[感谢@Steve Jessop澄清失败模式,并参见@Michael Burr的答案,为什么有些编译器允许这样做]:来自C11,6.5.3.4./1:

sizeof运算符不应用于具有函数类型的表达式

Kerrek SB answered 2019-09-11T08:46:36Z
55 votes

这不是未定义的行为 - 当使用带有函数指示符(函数名称)的sizeof运算符时,C语言标准需要诊断,因为它违反了-pedantic运算符。

但是,作为C语言的扩展,GCC允许对sizeof指针和函数指针进行算术运算,这是通过将-pedantic或函数的大小视为-Wpointer-arith来完成的。因此,-Werror=pointer-arith运算符将评估为1void或 GCC的功能。 见[http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith]

通过使用-pedantic-Wpointer-arith选项将GCC用于sizeof,可以让GCC发出警告。 或者使其成为-Werror=pointer-arith的错误。

Michael Burr answered 2019-09-11T08:47:19Z
13 votes

它表示编译器编写器决定值为1而不是让恶魔从你的鼻子中飞出(实际上,它是另一个未定义的使用1给了我们这个表达式:“C编译器本身必须发出诊断IF这是第一个 由你的程序产生的必要诊断,然后MAY本身会导致恶魔从你的鼻子飞过(顺便说一句,很可能是记录的诊断信息),就像它可能会进一步诊断进一步违反语法规则或约束一样(或者 ,就此而言,由于它选择的任何原因)。“[https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J]

从这里可以得出俚语术语“鼻子恶魔”,无论编译器决定如何应对未定义的构造。 1是本案例编译器的鼻恶魔。

Jon Hanna answered 2019-09-11T08:47:52Z
7 votes

正如其他人所指出的,sizeof()可以获取任何有效的标识符,但它不会返回函数名称的有效(真实且真实且有效)结果。 此外,它肯定可能会或可能不会导致“恶魔出鼻”综合症。

如果要分析程序函数大小,请检查链接器映射,该映射可以在中间结果目录(将事物编译为.obj / .o或生成的映像/可执行文件所在的目录)中找到。 有时可以生成或不生成此映射文件...它依赖于编译器/链接器。

如果你想要一个函数指针的大小,它们的大小都是相同的,就是cpu上的一个寻址字的大小。

jpinto3912 answered 2019-09-11T08:48:35Z
translate from https://stackoverflow.com:/questions/12259101/why-is-the-size-of-a-function-in-c-always-1-byte