返回变量的内联函数

时间:2016-11-27 15:40:15

标签: c gcc

我有以下结构:

test.h:

extern BOOL some_variable;

inline BOOL get_some_variable()
{
    return some_variable;
}

test.c的

BOOL some_variable = 10;
// some functions that change 'some_variable'.

的main.c

int main()
{
    while(1) {
        if (get_some_variable()) { // do something }
    }
}

我的问题是,这是否会按预期工作。通过这个我的意思是将主要呼叫替换为'some_variable'?或者这将创建' some_variable'的副本。或类似的东西?内联函数是否需要在某处声明为extern?

我知道我可以检查一下'some_variable'在main.c中不需要函数,但这种方式对我来说似乎更优雅。或者有更好的方法,在不调用函数的情况下返回其他源文件中的变量。我希望这能减少获得“some_variable”所需的操作次数。因为这是针对微控制器的。

2 个答案:

答案 0 :(得分:2)

是的,我认为该函数应该在某处严格声明extern,但如果函数实际上是在任何地方内联的,那么您将不会注意到extern定义的缺失。标准说:

  

6.7.4函数说明符

     

¶7任何具有内部链接的函数都可以是内联函数。用于外部功能   链接,以下限制适用:如果使用内联声明函数   函数说明符,那么它也应该在同一个翻译单元中定义。如果所有的   翻译单元中函数的文件范围声明包括内联函数   没有extern的说明符,那么该翻译单元中的定义是内联的   定义。内联定义不提供函数的外部定义,   并且不禁止在另一个翻译单元中使用外部定义。内联定义   提供了外部定义的替代方案,翻译人员可以使用该定义来实现   在同一翻译单元中对该功能的任何调用。没有具体说明是否打电话给   函数使用内联定义或外部定义。 140)

     

140)由于内联定义与相应的外部定义和任何其他定义不同   其他翻译单元中的相应内联定义,所有具有静态存储的对应对象   持续时间在每个定义中也是不同的。

只要main.c#include <test.h>,那么您很可能会在main()程序中以内联函数的主体结束 - 没有函数调用开销。

总的来说,在任何地方使用static inline可能是最安全的(John Bollinger suggests)。另见Is inline without static or extern ever useful in C,关于SO可能还有其他相关问题。

答案 1 :(得分:2)

我同意@ JonathanLeffler的结论,即你提出的内联函数定义的形式需要在函数get_some_variable()的某个地方使用外部定义,而test.h不提供。可能会发现你的编译器仍然成功地构建了你的程序,因为它可能会随处选择使用提供的内联函数而不是错误承诺的外部函数。

然而,你所做的似乎有点傻。具有外部链接的函数的内联定义的重点是为外部函数提供可选的本地替代。如果您希望始终使用内联函数,那么在test.h中将其声明为static是合适的:

extern BOOL some_variable;

static inline BOOL get_some_variable()
{
    return some_variable;
}

通常希望避免标题中的静态声明,因为它们在包含标题的每个翻译单元中都会重复,但在这种情况下,这正是您想要的。

或者第三方面,在这种特殊情况下,您可以考虑直接访问变量,无论如何都可以从每个翻译单元完成。如果您希望封装some_variable并限制对它的访问,那么您需要采用不同的方法。