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

Gop*_*opi 3 c

static uint32_t a[20] = {0};
Run Code Online (Sandbox Code Playgroud)

uint32_t a[20] = {0};
Run Code Online (Sandbox Code Playgroud)

我在代码中使用了它们

a[0] = 1;
Run Code Online (Sandbox Code Playgroud)

等等....

当我创建变量static并使用它时出现错误

variable "a" was declared but never referenced
Run Code Online (Sandbox Code Playgroud)

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

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

错误与 MACROS 有关。

数组声明已完成,并且由某些平台使用,我没有看到任何错误。相同的代码会产生错误,因为此声明/数组未在其他平台上使用。

我的错 !!!!

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

   a[0] = 1;

   #endif
 ................
}
Run Code Online (Sandbox Code Playgroud)

现在在ABC平台上编译没有错误,在某些非ABC平台上编译时有错误。

解决方案:将全局也包裹在各自的宏下

#ifdef ABC
static uint32_t a[20] = {0};
#endif
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

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

\n\n

引用C11,章节 \xc2\xa76.2.2

\n\n
\n

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

\n
\n\n

因此,在全局的情况下static,您不能在翻译单元之外使用该变量。

\n

  • @Gopi 你能解释一下不清楚的地方或者你需要详细说明的地方吗? (2认同)