这两个有什么不同吗?如果是这样,究竟有什么区别?假设它们处于可以被多次调用的C函数中。
在同一声明中声明并指定
static uint32_t value = x;
// x varies and may be passed into function.
在一个陈述中声明并在下一个陈述中指定。
static uint32_t value
;
value = x; // x varies
;
value
仅在第一次声明/初始化时更新,甚至在后续调用时更新。
我对(1)的理解是它仅在第一次执行该行时设置,因此即使x
在下一次执行该行时发生更改,value
也将保持不变。我不确定(2)但对两者的澄清将非常有帮助
编辑:编译器ARM(ADS1.20)。 编辑:关于(2)从目前为止给出的答案的后续问题。是在每次通话还是第一次重复声明(不是作业)?
答案 0 :(得分:11)
第一个不应该编译;静态变量需要一个常量初始化器。
每次调用函数时,第二个设置value
,因此无需首先将其设为static
。
如果第一个表示法是正确的 - 初始化value
为1,比如说 - 然后它会在程序启动时初始化一次,然后在代码更改时只接受新值。第二种表示法仍然在每次调用函数时设置value
,因此使static
的使用毫无意义。 (好吧,如果你足够努力,你可以设计第二个版本用于静态的场景。例如,如果函数返回指向其他代码然后修改的指针,那么可能需要它,但那是在极端的深奥,将是一个非常糟糕的“代码味道”。)
答案 1 :(得分:2)
1只执行一次,但每次重新分配2个值。 静态变量仅初始化一次。
答案 2 :(得分:2)
这些是非常不同的声明。
第一个是声明一个静态局部变量并给它一个初始值(鉴于x不是常量,这实际上不应该编译)。这只会在每次执行函数之前发生一次。这几乎肯定是你想要的初始化。
第二个声明是每次调用函数时更新值。如果您希望变量始终以相同的值启动函数,这是正确的方法。但如果这真的是你想要的,那么为什么要使用静态呢?只需使用局部变量。
答案 3 :(得分:0)
你的直觉是正确的。在第二个示例中,每次调用方法时都将值设置为x。如果你只希望它运行一次,则需要在一个语句中初始化和声明静态变量。
如果您始终希望值具有值x,请不要将其声明为静态。
答案 4 :(得分:0)
编译时,第一个将被放入“.data”部分,其中数据被初始化,而第二个将被放入“.bss”部分,其中数据未初始化。
使用readelf -S xx.o可以检查编译目标文件的节大小。
示例1: static int i;
void test(){
i = 2;
}
示例2:
static int i=1;
void test(){
i = 2;
}
答案 5 :(得分:0)
民众 - 在C中,第一个声明完全合法。它将编译,并可用于初始化值。您可以组合第二个声明中的代码行,以确保每次后续函数执行时都会更新。这通常被使用,特别是在内存和资源比计算机或分布式应用程序更稀缺的嵌入式程序中。
您将使用静态的原因是确保变量具有在整个程序执行期间继续的数据生命周期,同时限制其仅对声明静态的函数的访问,或者如果静态声明处于打开状态则限制文件中的任何函数文件顶部,否则,每次退出该功能时数据都将丢失。这是一种很好的编程习惯,可以避免无意中访问必须受到保护和限制的数据对象。该注释仅适用于C编程语言,不要误以为它适用于C ++(在某些情况下它在某些情况下)或JAVA。 Java中的静态具有完全不同的含义。从我在这个帖子中看到的,似乎很少理解关键字static在C中是如何工作的,并且使关键字静态形式混淆其他语言在C中应用。在C中,static是一个非常重要的关键字,有助于管理函数和数据访问,您可以使用另一个变量初始化静态变量,前提是它在范围内,并且您可以在程序执行期间更新该值,这可能是您需要做的事情。