static constとconstの違いは何ですか?


84

違いは何であるstatic constとはconst?例えば:

それらの間に違いはありますか?いつ使用しますか?



5
再開に投票しました。「重複」とは、メモリ使用量に固有のまったく異なる質問をすることです。この質問は、違いについてより一般的な質問をします。
rmaddy 2015年

回答:


58

違いはリンケージです。

iオブジェクトが定義されている変換単位の外部で使用されていない場合は、static指定子を使用して宣言する必要があります。

これにより、コンパイラーは(潜在的に)さらに最適化を実行し、オブジェクトがその変換単位の外部で使用されていないことをリーダーに通知できます。


8
+1これらの宣言が関数内にある場合の意味も追加できれば素晴らしいと思います。
プレトリアン2012年

それconst int i = 5;は外部リンケージを持っていますか?C ++では、それはない...
Kerrek SB

4
ファイルスコープの@KerrekSB、はい。(C99、6.2.2p5)「オブジェクトの識別子の宣言にファイルスコープがあり、ストレージクラス指定子がない場合、そのリンクは外部です。」
ouah 2012年

13
@KerrekSB:CとC ++は同じ言語ではありません。特に、CconstはC ++とは何の関係もありませんconst
R .. GitHub STOP

コンパイラは本当に静的に基づいて最適化しますか?静的オブジェクトは、非静的関数によって渡されたり、非静的グローバルポインターによってポイントされたりする可能性があるため、変換ユニットの外部で使用されていないと想定するのは安全ではないようです。
NW。

99

static関数の外部の可視性または内部の変数の寿命を決定します。したがって、constそれ自体は何の関係もありません。

const 初期化後に値を変更しないことを意味します。

static 関数内とは、関数が終了する前後に変数が存在することを意味します。

static関数の外側とは、マークされたシンボルのスコープがstaticその.cファイルに限定されており、その外側からは見えないことを意味します。

技術的には(これを調べたい場合)、staticはストレージ指定子でconstあり、型修飾子です。


0

const int i = 5;
iがローカルで定義および宣言されている場合、静的const int a = 5の場合、ポインタを使用して変更できるi値。またはconstint i = 5; グローバルに、データセグメントのROメモリに保存されているため、変更できません。


-1

これらの定義が関数内にあるかどうかによって異なります。関数の場合の答えは、上記のouahによって与えられます。関数では効果が異なり、以下の例で示されています。

ローカル変数を「本当に一定」にしたい場合は、「const」だけでなく「staticconst」も定義する必要があります。


それは私のために完全にコンパイルされます...しかし、この場合、静的const変数を持つのはばかげていることを私は知っています。
DrumM 2018

1
@DrumMそれは愚かではありません。foo変数の場合は毎回再初期化されますmy_function()呼び出される、異なるランダム値が割り当てられます。bar変数が1回だけ初期化された場合、最初の時間my_function()が呼び出され、プログラムの存続期間中に同じ値が割り当てられます。したがって、静的ストレージ期間。
JB

1
実際、さらに考えてみると、CとC ++のどちらを使用しているかによって異なります。質問にはCのタグが付けられています。この場合、次のbar理由で割り当てのコンパイルエラーが発生します。rand()コンパイル時定数でないし。
JB

1
@nibotは、ストレージの仕様と型の修飾を参照して、「効果が異なる」と「本当に一定」の意味を明確にできますか?
JB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.