考虑以下代码:
static uint8_t tab[] = {1, 2};
void foo() {
uint8_t tab2[] = {1, 2};
}
我在这里有两个数组,一个数组用static
关键字,第二个数组在函数内。我应该如何正确命名每个人?因为那两个是静态的。我知道tab
数组将永远存在的区别与tab2
不存在,foo()
数组仅在执行函数tab2
时存在。如果void bar() {
static uint8_t tab[] = { 1, 2 };
}
是在函数退出后死亡的静态数组,是否不应该将其称为另一个?那些有助于编程理论的数组的专有名称是什么?
另一个例子:
NewTest() {
PageFactory.initElements(driver, this);
}
根据此类变量的编程理论,专有名称是什么? “静态为静态”数组?
答案 0 :(得分:6)
static
关键字的意思是static storage duration and internal linkage(除非在块范围内,它表示静态存储持续时间和 no 链接,因为从不链接块范围的事物。)
您的tab2
不是静态的,它具有自动的存储期限,并且没有链接。 (甚至还有一个关键字auto
,它是隐含的,但是通常不使用。不要将其与C ++混淆,C ++已经“回收”了该关键字以具有完全不同的含义。)
您赋予变量的标识符-例如tab
或tab2
–由您决定。但是,它们 的含义由以下语言很好地定义:
tab
是两个uint8_t
的静态全局数组。它具有静态存储持续时间和内部链接。tab2
是由两个uint8_t
组成的 block范围数组。它具有自动存储时间和 no 链接。tab
是由两个uint8_t
组成的静态块范围数组。它具有静态存储期限和 no 链接。答案 1 :(得分:2)
这里似乎存在误解。这不完全是您的错,在C语言中看到“静态”意味着至少有两种不同的情况。
您的tab2
不是静态的。它没有静态存储持续时间,也没有与静态存储相关的任何方式。它只是一个数组。这是一个局部变量,它是一个数组。
您的tab
是一个全局数组,可为其提供静态存储持续时间,并且由于关键字static
而具有内部链接。如果在函数中,则为“函数静态”。
如果我是你,我不会为术语担心太多。相反,请担心使程序执行您想要的操作!
答案 2 :(得分:2)
清除条款:
1) static uint8_t tab[] = {1, 2};
2) void foo() { uint8_t tab2[] = {1, 2}; ...
范围:
1)是在文件作用域中声明的变量。 2)是在本地范围中声明的变量。范围确定在何处可访问变量。
存储期限:
main()
之前将此类变量初始化为零或特定值。在文件作用域声明的所有变量都具有静态存储持续时间。
所有声明为static
的变量都具有静态存储持续时间。
在本地范围内声明的所有变量(不带static
)都具有自动存储期限。
(extern
等还有其他一些情况,但这在这里不相关。这里有链接一词,在这里我不会解决。)
知道这一点,然后“因为这两个是静态的”是没有道理的。它们具有静态设置的固定大小,但这就是它们的共同点。
关于命名,这是主观的,并且取决于您自己的编码标准。给他们直观的名称来说明它们包含的内容,而不是它们的类型。
一些较旧的编码标准喜欢将声明为static
的文件范围变量视为私有变量,因此使用了_
前缀来表明这一点。但这是一种不好的做法,因为它违反了C标准(和POSIX标准)的命名规则。
答案 3 :(得分:1)
归因于编程理论的那些数组的专有名称是什么?
命名标识符不是编程理论的一部分。如何命名它们取决于最佳实践,惯例,公司标准等。而如何做到这一点是基于意见的。
答案 4 :(得分:1)
C有很多 classes (名称是我的)变量,并且范围(变量可以访问代码的哪一部分)和持续时间各不相同。
在文件级别(任何功能之外):
在函数或集团内部:
此外,可以将变量声明为extern
。在这种情况下,仅声明变量,并且必须在同一编译单元或另一编译单元中的具有相同声明的其他位置进行定义。
为详尽起见,C在持续时间上还有另一类:已分配。它用于通过malloc创建的对象,这些对象将持续存在,直到显式释放它们为止。但要注意:程序员有责任使用正常范围规则保留指向该对象的指针,以便能够释放它。
答案 5 :(得分:1)
static
表示“在此翻译单元本地”。
示例:
static int variable=42;
static int function(){return 0;}
//won't be visible in other translation units
static
在块范围的声明中表示“具有静态存储持续时间”:
示例:
uint8_t *bar() {
static uint8_t tab[] = { 1, 2 };
return &tab[0];
//ok with static but pretty much always an error otherwise
}
int how_many_times_i_ran(){ static unsigned x; return x++; }
static
位于“数组类型”函数参数的括号内,表示后面的整数表达式表示指针必须指向的最小元素数。
void take3(int Three[static 2+1]);
void call()
{
take3((int[3]){0}); //OK
take3(0); //undefined
take3((int[2]){0}); //undefined
}