我正在查看ArduCopter代码。我看到ArcuCopter.pde中很少有变量声明为静态。但是,这些变量在其他.pde文件中调用。例如,对象g被定义为here为静态,并且在其他Attitude.pde文件中多次使用,例如this示例。
据我所知,静态memeber的范围仅限于文件,不能在其他文件中调用。所以我的问题是如何做到这一点?有没有办法访问其他文件中定义的静态成员?
答案 0 :(得分:0)
你是否可能会混淆'档案'和'翻译单位'。
请参阅此处http://port70.net/~nsz/c/c99/n1256.html#6.2.2
您可以对其他文件中声明的静态对象使用标识符,只要它们是同一翻译单元的一部分(并在使用时适当声明)。 )。
翻译单元是一个(通常是名义上的)文件,由一个源文件(可能是.c或.cpp)和所有#include
指令'扩展'组成。
您可以在另一个翻译单元中“使用”声明为静态的数据。但不是标识符。怎么样?
<强> daft.h 强>:
static int x=0;
int nextX(void);
<强> daft.c 强>
#include "daft.h"
int nextX(void){
return ++x;
}
<强> my.c 强>
#include <stdlib.h>
#include <stdio.h>
#include "daft.h"
int main(void){
printf("%d\n", nextX());//outputs 1.
printf("%d\n", x);//prints 0.
return EXIT_SUCCESS;
}
我们假设daft.c
和my.c
是源文件。他们的翻译单元的内部链接x
都有一个标识int
。
两个标识符和对象的存储是无关的!
对nextX()
的调用会访问x
内部链接的标识daft.c
的存储空间。直接访问x
可访问my.c
内部链接的标识符。
除非声明标识符const
在头文件中包含static
个链接标识符,否则通常会导致问题。