众所周知,关键字static
在C. C99中有multiple meanings,增加了合法写作的可能性
void foo (int arr[static 50])
{
// ...
}
这增加了混乱,而C ++具有静态成员变量和函数。
如果可以通过某种方式连接所有用途,这不会那么麻烦,但我发现很难找到某些情况下的链接。特别是为什么应该使用static
关键字来修改可见性(链接),或者实际上它与数组的最小元素数量有关。
那么滥用static
关键字是否存在历史原因,或者是否存在连接其所有用途的秘密链接?
答案 0 :(得分:26)
向某种语言添加新关键字会破坏向后兼容性。因此static
会被用于可能意味着某些内容的地方(int arr[static 50]
vs int arr[auto 50]
或int arr[extern 50]
),并且根据其在先前版本中的使用,无法在语法中出现。
虽然在这种情况下在该位置添加not_less_than
上下文敏感关键字不会破坏以前的代码,但它会添加另一个关键字(如此简单的文本编辑器,它们是关键字识别但不是语法识别,不会知道是否它是一个关键字),并打破了C中的'关键字不是上下文敏感'的简化。
答案 1 :(得分:2)
有一种非常简单的方法可以记住我所知道的static
的所有3个C ++含义。 static
表示“非常类似于全局变量/函数,但只能直接在......范围内使用”
struct
声明的类)。这种情况略有不同,因为您可以通过对象或前缀来访问变量/函数,但这有点像要求类或其对象提供对它的访问,实际上它可以被拒绝(使用{{ 1}})。所以访问不是“直接”。如果提供了C99数组语法,这是完全不同的东西,我认为不会像其他人所说的那样引入新的关键字。
答案 2 :(得分:1)
static
在C ++中的原始含义实际上已被弃用,取而代之的是未命名的命名空间。在当前C ++代码中实际使用static
的唯一方法是非成员。
答案 3 :(得分:1)
我认为这个关键字的不同用法的原因是不同的。如果我们将函数作用域和文件作用域的使用视为经典C的理所当然(它们至少是类似的概念),那么第一个额外的主题是C ++中的static
来命名一个类的全局成员。
我想这里的捷径只是“静态”和“全局”似乎足够接近,早期的C ++非常小心,不会引入会破坏现有代码的新关键字。因此,他们采用了一种现有的无法出现的情况。
对于数组参数的C99附加组件,我认为事情是不同的,因为static
不是唯一的补充,在这里。您可能还具有限定隐式指针的类型限定符(const
和volatile
):
void toto1(char str[const 5]);
void toto2(char*const str);
定义兼容的原型。我只能推测,为了你提到的目的(数组的最小长度),存储类说明符static
的选择被视为该语法的自然扩展。也可能很容易证明这种用法与其他语言兼容,通过争论可以使用类型限定符来扩展语言,存储类说明符不会造成太大的伤害。
答案 4 :(得分:-5)
骆驼是委员会设计的一匹马。
http://en.wikipedia.org/wiki/Design_by_committee
增加: 参与设计的委员会成员是保守的,并且对于不破坏现有C ++代码而不是新代码的潜在优雅感兴趣。