可能是我的问题有点傻,但我无法让这段代码正常工作。我已经阅读了类似的问题和答案,但有一些不同的情况。
所以,问题是:“是否有可能在内联函数中获取静态变量值?”
我为具有少量内存和低速的微控制器编写程序。出于某种原因,我需要内联一些函数(以节省内存和执行时间)。 这是问题描述:
例如,我的计划中有三个文件:main.c
,some.h
,some.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()
不是“内联”,那么一切都很完美,但需要更多的内存和执行时间。
答案 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,这不是一个好主意,标题是为了定义的对象的声明而保留的。建议您在标题中添加类型定义,对象的外部声明;但不鼓励定义对象(虽然不严格禁止,但这往往会导致冲突)。