Ker*_* SB 80
这是违反约束的行为,您的编译器应该对其进行诊断.如果它尽管如此编译它,你的程序有不确定的行为[感谢@Steve Jessop澄清失败模式,并参见@Michael Burr的答案,为什么有些编译器允许这样做]:来自C11,6.5.3.4./ 1:
的
sizeof
操作者不得应用于具有功能类型的表达式
Mic*_*urr 56
这不是未定义的行为 - 当使用sizeof
带有函数指示符(函数名称)的运算符时,C语言标准需要诊断,因为它违反了sizeof
运算符.
但是,作为C语言的扩展,GCC允许对void
指针和函数指针进行算术运算,这可以通过将a void
或函数的大小视为1
.因此,该sizeof
运营商将评估到1
的void
或与海湾合作委员会的功能.见http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith
sizeof
通过使用GCC -pedantic
或-Wpointer-arith
选项,您可以让GCC在使用这些操作数时发出警告.或者使它成为一个错误-Werror=pointer-arith
.
Jon*_*nna 13
它表示编译器编写器决定值为1而不是让恶魔从你的鼻子中飞出(事实上,这是另一个未定义的用法,sizeof
它给了我们这个表达式:"C编译器本身必须发出诊断,如果这是第一个必需的从你的程序产生的诊断,然后MAY本身会导致恶魔从你的鼻子飞过(顺便说一句,很可能是记录的诊断信息),就像它可能会进一步诊断进一步违反语法规则或约束一样(或者,就此而言,无论出于何种原因选择)." https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
从这里可以得出俚语术语"鼻子恶魔",无论编译器决定如何应对未定义的构造.1
对于这种情况,这是这个编译器的鼻恶魔.
正如其他人所指出的,sizeof()可以获取任何有效的标识符,但它不会返回函数名称的有效(真实且真实且有效)结果.此外,它肯定可能会或可能不会导致"恶魔出鼻"综合症.
如果要分析程序函数大小,请检查链接器映射,该映射可以在中间结果目录(将事物编译为.obj/.o或生成的映像/可执行文件所在的目录)中找到.有时可以生成或不生成此映射文件...它依赖于编译器/链接器.
如果你想要一个函数指针的大小,它们的大小都是相同的,就是cpu上的一个寻址字的大小.