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

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

这是一个违反约束,你的编译器应该诊断它。 尽pipe如此,如果它编译的话,你的程序还有一个未定义的行为[感谢@Steve Jessop澄清失败模式,见@Michael Burr的回答为什么一些编译器允许这样做]:从C11,6.5.3.4./ 1:

sizeof运算符不能应用于具有函数types的expression式

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

但是,作为C语言的扩展,GCC允许通过将void或函数的大小视为1来实现void指针和函数指针的算术运算。 结果, sizeof运算符将评估为1或者GCC的function为void 。 请参阅http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

通过对GCC使用-pedantic-Wpointer-arith选项,可以使GCC对这些操作数使用sizeof时发出警告。 或者用-Werror=pointer-arith使之成为错误。

它表示编译器作者决定值为1,而不是让恶魔从你的鼻子飞(实际上,这是另一个未定义的使用sizeof ,给了我们这样的expression:“C编译器本身必须发出诊断IF这是第一个需要从你的程序得到诊断,然后可能会导致恶魔从你的鼻子飞(顺便说一下,这可能是logging的诊断信息),就像进一步违反语法规则或限制的进一步诊断(或,因为这个原因,它select)。“ https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

从这个angular度来说,无论编译器为了响应未定义的构造而决定做什么,都有俚语术语“鼻子恶魔”。 1是这种情况下编译器的鼻子恶魔。

正如其他人指出的那样,sizeof()可以采用任何有效的标识符,但是不会返回函数名称的有效(真实有效)结果。 此外,它肯定可能,也可能不会导致“恶魔脱鼻”综合征。

如果你想分析你的程序function的大小,请检查链接器映射,它可以在中间结果目录(将事物编译为.obj / .o或生成的映像/可执行文件所在的目录)中find。 有时候,有一个选项可以生成或不生成这个映射文件…它依赖于编译器/链接器。

如果你想要一个指向函数的指针的大小,它们的大小都是一样的,就是你CPU上的一个地址字的大小。