web-dev-qa-db-ja.com

静的constとconstの違いは何ですか?

違いは何ですか static constおよびconst?例えば:

static const int a=5;
const int i=5;

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

62
Lior

違いはリンケージです。

// At file scope
static const int a=5;  // internal linkage
const int i=5;         // external linkage

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

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

47
ouah

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

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

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

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

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

73
Joe

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

#include <stdlib.h>

void my_function() {
  const int foo = Rand();         // Perfectly OK!
  static const int bar = Rand();  // Compile time error.
}

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

0
nibot