gpt4 book ai didi

c - 两个 c 文件之间的全局内联函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:26 24 4
gpt4 key购买 nike

来自 this question我之前问过。我想知道如何在全局范围内定义 inline 函数。

我想在 test.h 中声明内联函数,在 main.c 中定义调用它来自 test.c。

main.c 和 test.c 都是 #include "test.h"(代码示例请点击上面的链接)。

这基本上是用户可以启用/禁用的某种回调函数。并且只有一个文件应该具有函数已定义

我知道 inline 只是对编译器的一个建议,它对现代 CPU 没有太大影响,但这适用于 8 位微 Controller ,确实需要它。

编辑:

我在 test.c 中有一个调用这个内联函数的函数。我只想用 main.c 中定义的函数体替换调用。我希望这是有道理的。

最佳答案

大多数 8 位微 Controller 代码是用类似于 C89 的语言编写的(通常有扩展,例如内联汇编),inline 不是正式 C 的一部分,直到C99。所以首先要确定你正在编译的标准(如果有的话),如果 inline 是一个扩展(即不是 C99 内联),请查阅你的编译器手册。在该编程领域,编译器手册优先于 C 标准。

根据 C99 如果 main.ctest.c 都需要调用相同的函数并且需要将其标记为 inline,那么我相信它必须在 header 中定义,因为 inline 函数不能跨越翻译单元(即“.c”文件)。

例如:

测试.h:

static inline int add(int a, int b) { return a + b; }

ma​​in.c:

#include "test.h"
void main(void)
{
int x = add(10,15);
}

测试.c:

#include "test.h"
int test(void)
{
int x = add(10,15);
return x;
}

编辑:请参阅此处以更好地解释 C99 inline 用法:How to declare an inline function in C99 multi-file project?

但是,这可能会导致生成的目标代码出现各种奇怪的行为。例如,我看到一个来自主要 MCU 制造商的编译器(他们会故意不命名)为inline 函数#included 生成目标代码在给定的翻译单元中而不是内联它们。该文件包含在几个地方并包含许多功能,因此这导致整个代码库中整体 ROM 使用量大幅增加,因为链接器也无法删除死代码(请参阅 --gc-sections gcc) 并且未能提高性能,因为这些函数从未真正内联,即使它是 技术上 内联的正确使用。

我们对这个特定问题的解决方案是将所有函数转换为宏(这提供了 inline 预期的性能优势),但另一种方法是删除 inline 从声明并将定义移动到单个 .c 文件。

TL;DR:如果对 MCU 使用内联,1) 查阅您的编译器手册,2) 留意生成的目标代码。

关于c - 两个 c 文件之间的全局内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28606847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com