【问题标题】:C++: Can static variable be called in multiple files?C++:可以在多个文件中调用静态变量吗?
【发布时间】:2015-01-22 12:05:25
【问题描述】:

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

据我所知,静态成员的范围仅限于一个文件,不能在其他文件中调用。所以我的问题是如何做到这一点?有什么方法可以直接访问其他文件中定义的静态成员吗​​?

【问题讨论】:

  • 请在您的问题中添加最少的相关代码,不要指望人们点击每个链接只是为了回答您。
  • @Gyapti 我没有代码,因为我试图从具体实现中理解这个概念,因此我必须提供足够的外部参考来提出我的查询。因此,如果您想了解我的查询,则必须通过链接。
  • @iharob 当我尝试从其他文件中调用静态变量时,编译器给我错误提示无法识别变量。
  • 是的,我知道 extern 工作。但我想知道他们如何使用静态声明访问 ArduCopter 代码中其他文件中的变量
  • @iharob You're confusing scope with lifetime. Static variables have a lifetime equal to the program's lifetime, but they still follow scoping rules based on where they are declared. 来自here

标签: c++ c static arduino


【解决方案1】:

您是否混淆了“文件”和“翻译单元”。

参考这里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() 的调用将访问daft.c 内部链接的标识符x 的存储。直接访问x 访问的是在my.c 中内部链接的标识符。

除非标识符被声明为const,否则在头文件中有static链接标识符通常会导致麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多