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

众所周知,关键字static在C语言中有多重含义 .C99增加了合法写作的可能性

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

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

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

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

向语言添加新关键字会破坏向后兼容性。 因此static被用于可能意味着什么的东西( int arr[static 50] vs int arr[auto 50]int arr[extern 50] )并且根据其在先前版本中的使用而不能语法地出现在该位置。

虽然在这种情况下在该位置添加not_less_than上下文敏感关键字不会破坏以前的代码,但它会添加另一个关键字(如此简单的文本编辑器,它们是关键字识别但不是语法识别,不会知道它是否是关键字),以及打破C中的’关键字不是上下文敏感’简化

有一种非常简单的方法可以记住我所知道的static的所有3个C ++含义。 static意味着“非常像全局变量/函数,但只能直接在……的范围内使用”

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

在呈现的C99数组语法的情况下,这是完全不同的东西,我认为它不会像其他人所说的那样引入新的关键字。

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

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

我想这里的捷径只是“静态”和“全局”似乎足够接近,早期的C ++非常小心,不会引入会破坏现有代码的新关键字。 所以他们采用了现有的一种不能出现在这种背景下的东西。

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

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

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

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

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

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