获取内联函数中的静态变量值?

时间:2016-07-04 15:43:34

标签: c static inline

可能是我的问题有点傻,但我无法让这段代码正常工作。我已经阅读了类似的问题和答案,但有一些不同的情况。

所以,问题是:“是否有可能在内联函数中获取静态变量值?”

我为具有少量内存和低速的微控制器编写程序。出于某种原因,我需要内联一些函数(以节省内存和执行时间)。 这是问题描述:

例如,我的计划中有三个文件:main.csome.hsome.c

some.c

#include "some.h"
static int foo;

[... other functions that uses "foo"]

some.h

#ifndef SOME_H_
#define SOME_H_
    static int foo;

    inline int __attribute__((always_inline))
    get_foo(void){
        return foo;
    }
#endif

main.c

#include "some.h"
int bar;
int main(void){
   bar = get_foo();
   return bar;
}

当我尝试编译时,我得到了以下内容:

warning: 'foo' is static but used in inline function 'get_foo' which is not static

当我尝试将extern static int foo;放到some.h时,我得到了:

error: multiple storage classes in declaration specifiers
error: static declaration of 'foo' follows non-static declaration

我需要在“内联”函数中从外部文件中获取“静态”变量的值。我想让它们“静态”与主代码分开,作为局部变量。这是正确的方法吗?

提前谢谢!

修改

更清楚:我需要通过内联函数将变量的值放在另一个文件(some.c)中的一个文件(main.c)中。如果函数get_foo()不是“内联”,那么一切都很完美,但需要更多的内存和执行时间。

4 个答案:

答案 0 :(得分:2)

在这种情况下,static表示变量foo在每个源文件中都是不同的foo。如果您在标头中将static int foo;更改为extern int foo;,然后在一个.c文件中只有一个int foo;,我认为编译器警告将消失,您的内联函数将正常工作。

在文件范围内,static隐藏了链接器中的名称,因此您可以在每个文件中有效地使用不同的变量。

extern static int foo;只是一个错误。这意味着,在我希望您链接到的其他文件中有一些名为foo的东西,但名称是隐藏的。编译器只是说"忘了它"。

答案 1 :(得分:1)

在头文件中定义静态变量没有意义。每次包含该头文件时,您将获得变量的新副本...

为什么不将其定义为

extern int foo;

通过这种方式,您可以从包含标题

的任何来源获得变量

答案 2 :(得分:0)

如果您想在特定的翻译单元中使用变量static,那么将在另一个翻译单元中“生活”的inline函数永远无法访问此static个对象。这就是为什么不允许从static函数访问inline对象的原因,这意味着什么的语义不明确。

您可以定义一个extern函数来提供定义它的TU的值,或者static函数在每个仅提供值的TU中具有不同的实例。

答案 3 :(得分:0)

您的内联请求在某种程度上与变量的内部链接不兼容。

您有一个静态变量,这意味着此变量仅在该文件中可见。

另一方面,你有一个内联函数。如果此函数将在此文件中的其他位置内联,那么它将引用另一个foo变量,这可能不是您想要的;至少编译器警告你。它建议您将该函数的可见性更改为静态,以便仅在与foo相同的实体中可用。

在另一次尝试中,您添加了extern,但这与静态可见性,选择,外部或静态不兼容。有关更多信息,请阅读C语言中的链接和可见性规则。

你还建议在某些标题中添加foo,这不是一个好主意,标题是为了定义的对象的声明而保留的。建议您在标题中添加类型定义,对象的外部声明;但不鼓励定义对象(虽然不严格禁止,但这往往会导致冲突)。