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