C ++:可以在多个文件中调用静态变量吗?

时间:2015-01-22 12:05:25

标签: c++ c static arduino

我正在查看ArduCopter代码。我看到ArcuCopter.pde中很少有变量声明为静态。但是,这些变量在其他.pde文件中调用。例如,对象g被定义为here为静态,并且在其他Attitude.pde文件中多次使用,例如this示例。

据我所知,静态memeber的范围仅限于文件,不能在其他文件中调用。所以我的问题是如何做到这一点?有没有办法访问其他文件中定义的静态成员?

1 个答案:

答案 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.cmy.c是源文件。他们的翻译单元的内部链接x都有一个标识int。 两个标识符和对象的存储是无关的! 对nextX()的调用会访问x内部链接的标识daft.c的存储空间。直接访问x可访问my.c内部链接的标识符。

除非声明标识符const在头文件中包含static个链接标识符,否则通常会导致问题。