c - 在 C 中,是否应将标头中的内联函数外部化到 .c 文件中?
问题描述
我已经看到一些关于这个一般主题的问题,但我仍然不确定 ISO C 的正确方法是什么,以及它可能与 GNU C 有何不同。
如果我有一些用关键字定义的函数inline void foo()
,我是否也应该将该函数声明为?假设多个文件将包括.file.h
inline
file.c
extern void foo();
.c
file.h
从我读到的答案似乎是“是”,并且与编译器如何查找其他翻译单元发出的定义有关,但老实说,我并不完全理解其中的含义。
我现在正在开发一个项目,该项目inline
在头文件中声明了很多函数,而这些函数都没有在相应的.c
文件中声明。一切都编译没有 gcc 抱怨,但这种方法真的正确吗?
解决方案
是的,如果您使用inline
without static
,则需要在某处对该函数进行实际的外部定义,以防编译器拒绝在一个或多个位置内联它。做到这一点的规范方法是制作一个源文件,其中只包含(使用您的示例名称):
#include "file.h"
extern void foo();
就个人而言,我发现C 中的语义令人困惑和混乱,并且更喜欢通过制作所有函数extern inline
来完全避免它们。当然,如果编译器拒绝内联,这会浪费函数的多个实例化空间,但无论如何你都不应该对非平凡大小的函数执行此操作。inline
static
推荐阅读
- django - 如何在 Django 中限制 18 岁以下用户的表单验证
- computer-vision - 是否实施了任何用于行人检测或行人跟踪的光流算法?
- php - 使用 ajax 发送的数据有效,但 $_POST 和 GET 在 php 后端文件中不起作用
- selenium - Selenium,如何阻止来自 chrome 的位置“警报”?
- database - 如何规范化具有外键的表
- reactjs - 如何使用 useEffect 正确生成 html 元素?
- audio - 如何删除 ffmpeg 转换生成的 .mp3 文件开头的零填充?
- sql - 外键返回 null
- symfony - 我的 Webpack Encore 只加载文件名,不加载文件内容?
- asp.net-core - Dart 上传文件到 asp.net Core