2011-01-06 14 views
28

私たちが知っているように、キーワードstaticはC. C99でmultiple meaningsが合法的に混乱を追加し、C++の静的メンバ変数と関数を持っていCおよびC++で「静的」キーワードが非常に多くの意味を持つのはなぜですか?

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

を書くの可能性を追加しました。

すべての用途が何らかの方法で接続できるのであれば、これは面倒なことではありませんが、いくつかのケースでそのリンクを見つけるのは難しいです。特に、可視性(リンケージ)を変更するためにstaticキーワードを使用する必要がありますか、配列の最小量で何を行う必要があるのでしょうか。

staticキーワードを悪用した歴史的な理由はありますか、またはすべての用途をつなぐ秘密のリンクがフードの下にありますか?

+1

例のコードの構文は何を意味していますか? – Kos

+3

"arr"パラメータには少なくとも50要素があることが保証されています。 – Oystein

+1

[ここ](http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array-parameter-of-function)を参照してください – Oystein

答えて

26

言語に新しいキーワードを追加すると、下位互換性が損なわれます。したがって、staticは、その使用が多分何か(int arr[static 50]int arr[auto 50]またはint arr[extern 50])を意味するかもしれない場所で使用され、以前のバージョンでのその使用に基づいてその場所に構文的に現れることはできません。

その場合、その位置に文脈依存キーワードを追加すると前のコードが破られることはありませんが、別のキーワードが追加されます(キーワード認識はしていますが構文を認識しない単純なテキストエディタは、キーワードではなく、「キーワードは文脈依存ではありません。」を簡略化してCで作成しました。

+0

@ペテ:私はちょうどこの点を得ることができません... "後方互換性を壊す"とはどういう意味ですか?リストに新しいキーワードを追加できない、それ以上サポートされていないテキストエディタとの互換性、または別の意味ですか? –

+13

予約語として 'not_less_than'を追加すると、前のコードに' not_less_than'という名前の変数があった場合、前のコードを破棄することができます。これは、下位互換性を破ることを意味しています。 –

+3

はい、私は、キーワードを "再利用"する主な理由は、誰も自分がそれを識別子として、またはコード内で '#define 'として使用したことがないと確信していると思います。 – aschepler

-5

ラクダは委員会によって設計された馬です。

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

を追加しました:設計に関与 委員会のメンバーは保守的であり、新しいコードの潜在的な優雅さよりも、既存のC++コードを壊さないで、より興味を持っています。

+11

質問に良いコメントができますが、非常に貧しい答え。 –

+7

しかし、Cは馬であり、それはいいです。 –

+0

これは、「歴史的な理由はあるのですか?」などの質問をしたときの回答のタイプです。しかしそれはそれを良いものにしません。 –

1

static C++の元々の意味は、非推奨の名前空間で置き換えられました。 staticが現行のC++コードで実際に使用される唯一の方法は、非メンバーになることです。

+4

機能レベルの統計情報が忘れていませんか? (これは廃止予定ではありません)。C言語ではこれがstaticの「元の意味」であるのかどうかはわかりませんが、C++よりも前にこの使用があったと思います。 –

+0

@Fred: 'static'の元の意味はファイルスコープ変数です。ファンクションレベルの統計は忘れてしまったが、ファンクションレベルやクラスレベルの統計は、複数の意味には当てはまらないという概念に似ているように思える。 – Puppy

+0

@DeadMG:C99の静的な意味は全く違っているようですが、 –

1

このキーワードが持つさまざまな用途によって異なる理由があると思います。関数のスコープとファイルスコープの使用を、古典的なCとして与えられている場合(少なくとも類似の概念である場合)、トピックの最初の追加はC++のstaticで、クラスのグローバルメンバーを指定します。

ここでは、「静的」と「グローバル」は十分に近いと思われ、C++は既存のコードを破る新しいキーワードを導入しないよう非常に注意していたと思います。そこで彼らはそのような文脈では現れない既存のものを取った。

アレイパラメータのC99アドオンについては、staticが唯一の追加ではないので、これは異なるものと思われます。

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

は、互換性のプロトタイプを定義します。また、暗黙のポインタを修飾型修飾子(constvolatile)を有していてもよいです。私は、あなたが言及する目的のためのストレージクラス指定子static(配列の最小長さ)の選択は、その構文の自然な拡張として見られたとしか推測できません。おそらく、おそらく、この使用法は、言語を拡張するために型修飾子がどこで使用されるかもしれないと主張することによって、残りの言語と互換性があることが容易に証明されました。

2

私が知っているstaticの3つのC++の意味をすべて覚えておく方法は非常に簡単です。それがグローバルスコープにある場合staticは「かなり多くのグローバル変数/関数のようなものの...の範囲でのみ直接利用できる」

  • 「...このファイルを」を意味します。
  • "... this function"が(メンバー関数を含む)関数内にある場合。関数でクラスとラムダを作成した場合、それらはまだこのスコープにあることに注意してください。空のキャプチャを持つLambdaは、その "親"関数の静的変数にアクセスできます。
  • "... this class"がクラスに含まれている場合(structと宣言されたクラスを含む)この場合は、変数や関数にオブジェクトや接頭辞を使ってアクセスする場合とは少し異なりますが、これはクラスやそのオブジェクトにアクセス権を与えることと少し似ていて、実際には拒否できます(private) 。したがって、アクセスは「直接」ではありません。

提示されたC99配列構文の場合、これはまったく異なるものであり、私は新しいキーワードを導入しないと考えています。

関連する問題