首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么头文件包含完整的代码实现?

为什么头文件包含完整的代码实现?
EN

Stack Overflow用户
提问于 2014-08-30 19:54:30
回答 1查看 140关注 0票数 1

如果头文件不仅包括函数的原型,而且还包括完整的函数,那么在C中使用头文件的意义是什么?我在linux源代码中偶然发现了文件kdev_t.h,它包含以下内容:

代码语言:javascript
复制
    static inline dev_t new_decode_dev(u32 dev)
    {
         unsigned major = (dev & 0xfff00) >> 8;
         unsigned minor = (dev & 0xff) | ((dev >> 12) & 0xfff00);
         return MKDEV(major, minor);
    }

为什么是.h扩展?This问题指的是C++中的类,但我不确定同样的原理是否适用于这里。

EN

回答 1

Stack Overflow用户

发布于 2014-09-01 08:47:01

我没有任何来源来支持我,但我认为这是以下原因的组合:

  1. 优化。它足够小,如果编译器可以获得完整的实现,那么它将使优化变得更容易。这些小函数中的一些在内核中经常被调用,分支的成本可以很快累积起来。在您的示例中,代码实际上只做了一些小技巧-不值得保证对另一个目标文件的整个函数调用。但是,有了像LTO这样的特性,我不确定这是不是relevant.
  2. Macros对于任何比一行代码更长的东西来说都是痛苦的。有时,编写一个单独的函数有点夸张,但任务太长,不适合(人类可读的)宏。宏也有自己的一组令人头疼的问题。在维护人工readability.
  3. Empty实现的同时,static inline函数本质上提供了与宏相同的性能优势。内核具有很强的可配置性,您可以看到许多用于选项的#ifdef。有时,如果内核函数被禁用,我们仍然希望这些函数是可调用的,但只是返回一个错误。这些空的实现最好放在头文件中,而不是放在目标文件中,这样内核就不必在源代码树中的每个C文件上运行编译器。换句话说,我们改进了编译时间。显然,还有一些运行时优化,编译器可以提前知道死代码所在的位置。

我认为以上三个原因结合起来就是Linux在头文件中添加一些小函数的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25582076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档