我正在编写对性能敏感的代码,这确实需要我强制内联某些函数调用。
对于通过头文件在翻译单元之间共享的内联函数,通常必须将函数定义放在头文件中。我不想那样做。其中一些函数对不应在标头中公开的复杂数据结构进行操作。
我已经解决了这个问题,只需将所有 .h 和 .c 文件都包含在一个 .c 文件中,这样就只有一个翻译单元。(这会减慢重新编译的速度,但还不够重要。)
这将是“解决问题”,但它消除了当一个 C 文件中的函数调用另一个 C 文件中应该是私有的函数时出现错误,并且我想在这种情况下得到一个错误。所以,我有一个单独的 Makefile 条目,它执行“正常”构建,只是为了检查这种情况。
为了强制声明 inline 的函数在“正常”构建中很好地发挥作用,我实际上定义了一个宏 may_inline,它用于 inline 属性通常所在的位置。对于正常构建,它被定义为空,对于优化构建,它被定义为“内联”。
这似乎是一个可以接受的解决方案。我能看到的唯一缺点是我不能在具有相同原型的不同 .c 文件中拥有私有函数,但到目前为止,这对我来说并不是什么大问题。
另一个潜在的解决方案是使用GCC 的 Link-Time Optimization,它应该允许跨翻译单元内联。不过,这是一个新功能,我不相信它总是能按照我想要的方式内联。此外,我只能让它解决琐碎的问题,而不是我的实际代码。
这是一个可以接受的黑客,还是我在做一些非常愚蠢的事情?我以前从未见过这样做的事实让我有点紧张。