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)
主要区别在于,当定义为 时static,数组的范围仅限于翻译单元,而 ,如果没有 static,则范围不限于翻译单元。
引用C11,章节 \xc2\xa76.2.2
\n\n\n如果对象或函数的文件范围标识符的声明包含存储类\n说明符
\nstatic,则该标识符具有内部链接。
因此,在全局的情况下static,您不能在翻译单元之外使用该变量。