加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么标准禁止sizeof应用于函数

发布时间:2020-12-16 09:50:53 所属栏目:百科 来源:网络整理
导读:标准C(ISO / IEC 9899:1999)第6.5.3.4节说 The sizeof operator shall not be applied to an expression that has function type or an incomplete type 但为什么 ? 使用readelf检查可执行文件表明在编译期间完全了解函数大小. Symbol table '.symtab' con
标准C(ISO / IEC 9899:1999)第6.5.3.4节说

The sizeof operator shall not be applied to an expression that has
function type or an incomplete type

但为什么 ?
使用readelf检查可执行文件表明在编译期间完全了解函数大小.

Symbol table '.symtab' contains 67 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
.......
    37: 0000000000400541    16 FUNC    LOCAL  DEFAULT   13 clean
.......
    46: 00000000004005f0     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
......
    49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5
    52: 00000000004005f4     0 FUNC    GLOBAL DEFAULT   14 _fini
    53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
ed
    58: 0000000000400560   137 FUNC    GLOBAL DEFAULT   13 __libc_csu_init

    62: 000000000040052c    21 FUNC    GLOBAL DEFAULT   13 main

这里size 0属于共享库中的函数,例如放置@@ GLIBC_2.2.5函数.所以我检查了libc信息,这里有一段与puts @@ GLIBC_2.2.5相关的readelf -a /lib/x86_64-linux-gnu/libc.so.6输出

Size  Type 
  ...........   
  399: 0000000000070ec0   392 FUNC    WEAK   DEFAULT   12 puts@@GLIBC_2.2.5

它只是不必要的功能,还是它打破了C哲学,还是有一些我看不到的技术问题?

解决方法

我认为这是因为sizeof仅对对象有意义,对象的表示形式为unsigned char [sizeof(type)].现在在C中,函数没有表示(没有从函数指针类型到数据指针类型的转换),所以你可以说sizeof没有有意义的用法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读