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

Get value of static variables in inline functions?

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

所以,问题是:"Is it possible to get static variable value in inline functions?"

我编写的是内存小、速度慢的单片机程序。出于某种原因,我需要使一些函数内联(以节省内存和执行时间)。 这是问题描述:

例如,我的程序中有三个文件: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

我需要在 "inline" 函数中从外部文件中获取 "static" 变量的值。我想让它们 "static" 与主代码分开,作为局部变量。这是正确执行此操作的方法吗?

提前致谢!

编辑:

更清楚一点:我需要通过内联函数在另一个文件(main.c)中获取一个文件(some.c)中变量的值。如果函数 get_foo() 不是 "inline",则一切正常,但需要更多的内存和执行时间。

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

在文件范围内,static 向 link 用户隐藏了一个名称,因此您可以有效地在每个文件中拥有不同的变量。

extern static int foo; 只是一个错误。这意味着,在我想让你 link 访问的其他文件中有一个叫做 foo 的东西,但是这个名字是隐藏的。编译器只是说 "forget it"。

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

为什么不直接定义为

extern int foo;

这样您就可以从包含 header

的任何来源获得变量

如果您想在特定的翻译单元中使用您的变量 static,那么在另一个翻译单元中 "live" 的 inline 函数将永远无法访问此 static 对象。这就是为什么不允许从 inline 函数访问 static 对象,这意味着什么的语义根本不清楚。

您可以定义一个 extern 函数,在定义它的地方提供其 TU 的值,或者 static 函数在每个 TU 中具有不同的实例化,仅提供该值,那里。

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

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

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

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

您还建议在某些 header 中添加 foo,这不是一个好主意,header 保留用于声明 objects 而不是定义。鼓励您在 header 中添加类型定义,objects 的外部声明;但不鼓励定义 objects(虽然没有严格禁止,但这往往会导致冲突)。