静态和非静态全局有什么区别

时间:2016-05-04 09:17:18

标签: c

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

2 个答案:

答案 0 :(得分:4)

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

引用C11,章节§6.2.2

  

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

因此,如果static为全局,则您无法在翻译单元之外使用该变量。

答案 1 :(得分:0)

关键字static

案例1: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”已声明但从未引用

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