【问题标题】:What is the difference between static and non static global静态和非静态全局有什么区别
【发布时间】:2016-08-29 15:18:26
【问题描述】:
static uint32_t a[20] = {0};

uint32_t a[20] = {0};

我在代码中都使用了它们

a[0] = 1;

等等……

当我创建变量 static 并使用它时,我得到一个错误

variable "a" was declared but never referenced

但是当我删除 static 时,一切正常。

在这两种情况下,数组a 都是一个全局数组。

错误在于 MACROS 。

数组声明已完成,它被某些平台使用,我没有看到错误。相同的代码提供错误,因为此声明/数组未在其他平台上使用。

我的错!!!!

static uint32_t a[20] = {0};
void func()
{
 ...............
   #ifdef ABC

   a[0] = 1;

   #endif
 ................
}

现在在ABC平台上编译没有错误在一些非ABC平台上编译出现错误。

解决方案:将全局也包裹在相应的宏下

#ifdef ABC
static uint32_t a[20] = {0};
#endif

【问题讨论】:

  • static 表示“此变量在单元/文件之外不能直接访问”,但我不明白您为什么会收到这样的错误
  • 如果你得到一个变量被声明但从未引用的错误,你很可能声明了它但从未引用它。 (也许你引用了另一个同名的变量。)
  • @DavidSchwartz 是的,我想知道出了什么问题。我在我的代码中使用相同的数组。
  • 我使用 gcc 或 llvm 编译了 static uint32_t a[20] = {0}; 的代码,既没有错误也没有警告。
  • @Gopi 它告诉你出了什么问题,你声明了一个变量但没有引用它。正如我所说,您可能引用了具有相同名称的不同变量。尝试删除它告诉你没有被引用的所有声明——如果你的代码仍然可以编译和链接,那就对了。

标签: c


【解决方案1】:

主要区别在于,当定义为static时,数组的范围仅限于翻译单元,而如果没有静态,则范围不限于翻译单元。

引用C11,第 6.2.2 章

如果对象或函数的文件范围标识符的声明包含存储类 说明符static,标识符有内部链接。

因此,对于 static 全局变量,您不能在翻译单元之外使用该变量。

【讨论】:

  • 您能详细说明一下吗?
  • @Gopi 你能解释一下不清楚的地方或需要详细说明的地方吗?
  • 这是一篇关于 static variable in C++ 的帖子 - 在 C 语言中是否相同?
  • @user3078414 除了 C++ 有一个额外的含义之外,它是一样的:当你创建一个私有成员 static 时,你只能在该类的所有实例中获得一个这样的成员。
  • 感谢@Lundin,很好的解释!
【解决方案2】:

关键字static

案例一:file scope使用时

例子:

static int x=0; // declared outside main() and all functions

表示该变量只能在翻译单元内使用,即包含它的文件。

所以你不能这样做

extern int x; // from another file

案例2:block scope使用时

例子

somefunction()
{
static int x=0;
x++; // x acting as a counter here
}

变量x 在函数的不同调用期间保持不变(或未重新初始化)。您可以将其用作函数变量,例如,用作计算函数被调用次数的计数器。范围仅限于功能块。


关于警告:

变量“a”被声明但从未被引用

为自动变量分配的内存在脱离上下文时被释放。但静态变量并非如此。他们一直待到行刑结束。如果你不使用静态变量,编译器可能会警告你——我猜——这样你就可以避免这样的声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2011-04-23
    • 2014-07-29
    • 2018-11-23
    • 1970-01-01
    • 2015-09-26
    • 2010-09-25
    • 2013-07-21
    相关资源
    最近更新 更多