为什么“static”关键字在C和C ++中有这么多含义?

时间:2011-01-06 13:05:35

标签: c++ c static keyword

众所周知,关键字static在C. C99中有multiple meanings,增加了合法写作的可能性

void foo (int arr[static 50])
{
    // ...
}

这增加了混乱,而C ++具有静态成员变量和函数。

如果可以通过某种方式连接所有用途,这不会那么麻烦,但我发现很难找到某些情况下的链接。特别是为什么应该使用static关键字来修改可见性(链接),或者实际上它与数组的最小元素数量有关。

那么滥用static关键字是否存在历史原因,或者是否存在连接其所有用途的秘密链接?

5 个答案:

答案 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表示“非常类似于全局变量/函数,但只能直接在......范围内使用”

  • “......此文件”如果它在全球范围内。
  • “...此函数”如果它在函数中(包括成员函数)。请注意,如果在函数中创建类和lambdas,它们仍然在此范围内。具有空捕获的Lambda可以访问其“父”函数的静态变量。
  • “......此类”如果它在一个类中(包括那些用struct声明的类)。这种情况略有不同,因为您可以通过对象或前缀来访问变量/函数,但这有点像要求类或其对象提供对它的访问,实际上它可以被拒绝(使用{{ 1}})。所以访问不是“直接”。

如果提供了C99数组语法,这是完全不同的东西,我认为不会像其他人所说的那样引入新的关键字。

答案 2 :(得分:1)

static在C ++中的原始含义实际上已被弃用,取而代之的是未命名的命名空间。在当前C ++代码中实际使用static的唯一方法是非成员。

答案 3 :(得分:1)

我认为这个关键字的不同用法的原因是不同的。如果我们将函数作用域和文件作用域的使用视为经典C的理所当然(它们至少是类似的概念),那么第一个额外的主题是C ++中的static来命名一个类的全局成员。

我想这里的捷径只是“静态”和“全局”似乎足够接近,早期的C ++非常小心,不会引入会破坏现有代码的新关键字。因此,他们采用了一种现有的无法出现的情况。

对于数组参数的C99附加组件,我认为事情是不同的,因为static不是唯一的补充,在这里。您可能还具有限定隐式指针的类型限定符(constvolatile):

void toto1(char str[const 5]);
void toto2(char*const str);

定义兼容的原型。我只能推测,为了你提到的目的(数组的最小长度),存储类说明符static的选择被视为该语法的自然扩展。也可能很容易证明这种用法与其他语言兼容,通过争论可以使用类型限定符来扩展语言,存储类说明符不会造成太大的伤害。

答案 4 :(得分:-5)

骆驼是委员会设计的一匹马。

http://en.wikipedia.org/wiki/Design_by_committee

增加: 参与设计的委员会成员是保守的,并且对于不破坏现有C ++代码而不是新代码的潜在优雅感兴趣。