違いは何であるstatic const
とはconst
?例えば:
static const int a=5;
const int i=5;
それらの間に違いはありますか?いつ使用しますか?
違いは何であるstatic const
とはconst
?例えば:
static const int a=5;
const int i=5;
それらの間に違いはありますか?いつ使用しますか?
回答:
違いはリンケージです。
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
i
オブジェクトが定義されている変換単位の外部で使用されていない場合は、static
指定子を使用して宣言する必要があります。
これにより、コンパイラーは(潜在的に)さらに最適化を実行し、オブジェクトがその変換単位の外部で使用されていないことをリーダーに通知できます。
const int i = 5;
は外部リンケージを持っていますか?C ++では、それはない...
const
はC ++とは何の関係もありませんconst
。
const int i = 5;
iがローカルで定義および宣言されている場合、静的const int a = 5の場合、ポインタを使用して変更できるi値。またはconstint i = 5; グローバルに、データセグメントのROメモリに保存されているため、変更できません。
#include <stdio.h>
//const int a=10; /* can not modify */
int main(void) {
// your code goes here
//static const int const a=10; /* can not modify */
const int a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return 0;
}
これらの定義が関数内にあるかどうかによって異なります。関数外の場合の答えは、上記のouahによって与えられます。関数内では効果が異なり、以下の例で示されています。
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
ローカル変数を「本当に一定」にしたい場合は、「const」だけでなく「staticconst」も定義する必要があります。
foo
変数の場合は毎回再初期化されますmy_function()
呼び出される、異なるランダム値が割り当てられます。bar
変数が1回だけ初期化された場合、最初の時間my_function()
が呼び出され、プログラムの存続期間中に同じ値が割り当てられます。したがって、静的ストレージ期間。
bar
理由で割り当てのコンパイルエラーが発生します。rand()
コンパイル時定数でないし。