sizeof用于函数

shoren80 2013-03-29 10:04:51
看有人的博客说sizeof不能用于函数,可是下面在dev C++中有了结果,不明原因啊。。。
 
void testFun1()
{
printf("void fun!\n");
}

int testFun2()
{
return 1;
}
printf("sizeof(testFun1) = %d\n", sizeof(testFun1)); //1
printf("sizeof(testFun1()) = %d\n", sizeof(testFun1())); //1
printf("sizeof(testFun2) = %d\n", sizeof(testFun2)); //1
printf("sizeof(testFun2()) = %d\n", sizeof(testFun2())); //4
printf("sizeof(void) = %d\n", sizeof(void)); //1
printf("sizeof(void*) = %d\n", sizeof(void*)); //4

如果说sizeof作用于函数返回值的类型,前两个及第四个还说的通,第三个就说不通了。。
会不会sizeof找到一个不确定的类型,就以void形式处理呢?毕竟sizeof不会报错嘛。。
...全文
681 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
woniu_ge 2013-04-04
  • 打赏
  • 举报
回复
引用 26 楼 FrankHB1989 的回复:
引用 25 楼 woniu_ge 的回复: 引用 4 楼 gig886 的回复:这种不符合编码规范的代码是没有纠结价值的。++ 一般的语法就够用了,没必要穷究语法,编程应该是以简单的编码完成自己需要的功能,重点注意代码的可读,可扩展,就行了。 又是个语法和语义都没分清楚的菜么。
又是一个装b的么。
FrankHB1989 2013-03-31
  • 打赏
  • 举报
回复
引用 25 楼 woniu_ge 的回复:
引用 4 楼 gig886 的回复:这种不符合编码规范的代码是没有纠结价值的。++ 一般的语法就够用了,没必要穷究语法,编程应该是以简单的编码完成自己需要的功能,重点注意代码的可读,可扩展,就行了。
又是个语法和语义都没分清楚的菜么。
woniu_ge 2013-03-30
  • 打赏
  • 举报
回复
引用 4 楼 gig886 的回复:
这种不符合编码规范的代码是没有纠结价值的。
++ 一般的语法就够用了,没必要穷究语法,编程应该是以简单的编码完成自己需要的功能,重点注意代码的可读,可扩展,就行了。
SKATE11 2013-03-29
  • 打赏
  • 举报
回复
用vc6.0测试了下 void 和函数名都不行 编译不通过 真不必纠结这个
qwer_boo 2013-03-29
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
sizeof(函数名) 这个能不能编译通过还不一定呢,vs2010编译不通过。无需纠结这个问题吧,知道sizeof的使用场景及作用就可以了
++
gig886 2013-03-29
  • 打赏
  • 举报
回复
这种不符合编码规范的代码是没有纠结价值的。
starytx 2013-03-29
  • 打赏
  • 举报
回复
sizeof(函数名) 这个能不能编译通过还不一定呢,vs2010编译不通过。无需纠结这个问题吧,知道sizeof的使用场景及作用就可以了
liao05050075 2013-03-29
  • 打赏
  • 举报
回复
这个编译器相关。。我特意试了下,在我这里是编译不过的(gcc version 4.1.2) temp.c:13: error: ISO C++ forbids applying ‘sizeof’ to an expression of function type temp.c:14: error: invalid application of ‘sizeof’ to a void type temp.c:15: error: ISO C++ forbids applying ‘sizeof’ to an expression of function type temp.c:17: error: invalid application of ‘sizeof’ to a void type 建议你换个编译器
rocktyt 2013-03-29
  • 打赏
  • 举报
回复
sizeof作用于函数和void类型是未定义行为,结果取决于编译器
wizard_tiger 2013-03-29
  • 打赏
  • 举报
回复
不是血编译通不过,只是一个未定义行为,结果并不确定。
无间虚者 2013-03-29
  • 打赏
  • 举报
回复
引用 5 楼 qwer_boo 的回复:
引用 3 楼 starytx 的回复:sizeof(函数名) 这个能不能编译通过还不一定呢,vs2010编译不通过。无需纠结这个问题吧,知道sizeof的使用场景及作用就可以了++
FrankHB1989 2013-03-29
  • 打赏
  • 举报
回复
引用 20 楼 FrankHB1989 的回复:
引用 19 楼 lin5161678 的回复:引用 16 楼 FrankHB1989 的回复:引用 14 楼 lin5161678 的回复:引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( ……
其实还有更二的地方。 事实上,不管是ISO C还是ISO C++,sizeof拒绝函数类型操作数是明确的、实现需要给出diagnostic的错误,而不是未定义行为。特此更正,并向可能被误导者道歉。 因为一开始第一印象是shall not然后就习惯性当成UB了……但实际上这个shall not是属于违反constraints,不属于UB。其实当时看到C++就想起来了(C++里面的shall not更明确),结果手贱已经点了提交回复,还三连了,没法改……
lin5161678 2013-03-29
  • 打赏
  • 举报
回复
引用 20 楼 FrankHB1989 的回复:
引用 19 楼 lin5161678 的回复:引用 16 楼 FrankHB1989 的回复:引用 14 楼 lin5161678 的回复:引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( ……
哦 好吧 误会 哈哈
FrankHB1989 2013-03-29
  • 打赏
  • 举报
回复
引用 19 楼 lin5161678 的回复:
引用 16 楼 FrankHB1989 的回复:引用 14 楼 lin5161678 的回复:引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( strcpy( str,"dddddddd")……
对不起我二了……眼残把“ sizeof 里面的表达式”的“里面的”看漏了,请无视14楼。。。
lin5161678 2013-03-29
  • 打赏
  • 举报
回复
引用 16 楼 FrankHB1989 的回复:
引用 14 楼 lin5161678 的回复:引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( strcpy( str,"dddddddd") ) ); gcc 可以编译过,而且不是段……
那个表达式没有求值 所以 没有参数入栈 没有函数调用 没有函数运行 没有函数返回值 难道不是这样??
FrankHB1989 2013-03-29
  • 打赏
  • 举报
回复
引用 2 楼 liao05050075 的回复:
这个编译器相关。。我特意试了下,在我这里是编译不过的(gcc version 4.1.2) temp.c:13: error: ISO C++ forbids applying ‘sizeof’ to an expression of function type temp.c:14: error: invalid application of ‘sizeof’ to ……
注意这里是C语言版。 虽然这个问题答案类似(都是未定义行为),但只是侥幸。 举个反例: 空结构体在C(至少C11前,C11是不是有defect不清楚)是非法的,因为根本就没有语法支持;但C++允许。没记错的话GCC在这里也有扩展,而G++显然不会拒绝这个用法。
FrankHB1989 2013-03-29
  • 打赏
  • 举报
回复
sizeof(function designator)很明显就是UB,但是GCC有扩展接受这种兼容性差的代码。加上-pedantic-errors看看就知道了。 具体解释嘛Google一下应该很容易,再不行习惯下手动gcc.gnu.org上自己找找也好。
FrankHB1989 2013-03-29
  • 打赏
  • 举报
回复
引用 14 楼 lin5161678 的回复:
引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( strcpy( str,"dddddddd") ) ); gcc 可以编译过,而且不是段错误你可以在后面输出str 看看有没有改变 ……
先把“求值”的概念补补再说。
zhouxf_cn 2013-03-29
  • 打赏
  • 举报
回复
引用 14 楼 lin5161678 的回复:
引用 11 楼 Self_Chou 的回复:引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( strcpy( str,"dddddddd") ) ); gcc 可以编译过,而且不是段错误你可以在后面输出str 看看有没有改变 ……
我一直想表达的是strcpy不执行,而且我说的段错误是strcpy单独拿出来,好吧没说清楚
lin5161678 2013-03-29
  • 打赏
  • 举报
回复
引用 11 楼 Self_Chou 的回复:
引用 10 楼 lin5161678 的回复:引用 8 楼 Self_Chou 的回复:char *str = "hhhhhhhhhhh" printf( "%d\n", sizeof( strcpy( str,"dddddddd") ) ); gcc 可以编译过,而且不是段错误你可以在后面输出str 看看有没有改变 肯定段错误,这是我的一道笔试题,当时填了段错……
别傻了 不可能的 C语言里面 sizeof 的操作数是VLA 才会求值 操作数不是VLA的不会求值的 不会求值直白的说就是 没运行 不仅不会段错误 连str的值都没变 还是原来的hhhhhhhhhhhh 不仅是在GCC中没错误 在任何C语言编译器上面都没错误 给你一个链接 http://codepad.org/MpQP2Tvz
加载更多回复(7)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧