首页 > 解决方案 > 在 C 中,是否应将标头中的内联函数外部化到 .c 文件中?

问题描述

我已经看到一些关于这个一般主题的问题,但我仍然不确定 ISO C 的正确方法是什么,以及它可能与 GNU C 有何不同。

如果我有一些用关键字定义的函数inline void foo(),我是否也应该将该函数声明为?假设多个文件将包括.file.hinlinefile.cextern void foo();.cfile.h

从我读到的答案似乎是“是”,并且与编译器如何查找其他翻译单元发出的定义有关,但老实说,我并不完全理解其中的含义。

我现在正在开发一个项目,该项目inline在头文件中声明了很多函数,而这些函数都没有在相应的.c文件中声明。一切都编译没有 gcc 抱怨,但这种方法真的正确吗?

标签: c

解决方案


是的,如果您使用inlinewithout static,则需要在某处对该函数进行实际的外部定义,以防编译器拒绝在一个或多个位置内联它。做到这一点的规范方法是制作一个源文件,其中只包含(使用您的示例名称):

#include "file.h"
extern void foo();

就个人而言,我发现C 中的语义令人困惑和混乱,并且更喜欢通过制作所有函数extern inline来完全避免它们。当然,如果编译器拒绝内联,这会浪费函数的多个实例化空间,但无论如何你都不应该对非平凡大小的函数执行此操作。inlinestatic


推荐阅读