71


18

CではないのにconstがCの内部リンケージを意味するのはなぜですか?

件名を参照してください。 彼らは何を考えていましたか?

更新:混乱を避けるために「静的」から「内部リンケージ」に変更しました。

例を挙げれば… 以下をファイルに入れます。

const int var_a = 1;
int var_b = 1;

…​and compiling with g++ -c test.cpp only exports var_b.

7 Answer


97


私はあなたが意味すると思います

_ constがC ++の内部リンケージを意味する理由 _

名前空間スコープでconstオブジェクトを宣言した場合、それは内部リンケージを持ちます。

付録Cはその論理的根拠を与える

_ _ 変更: constが明示的に宣言され、externが明示的に宣言されていないファイルスコープの名前には内部リンケージがありますが、Cでは外部リンケージがあります

根拠: Cではconstオブジェクトはコンパイル時の値として使用できるため、この機能はプログラマに各constに明示的な初期化値を提供するように促します。 この機能により、ユーザーは多くのコンパイル単位に含まれるヘッダーファイルにconstオブジェクトを入れることができます。 _ _


10


litbが述べたように、constオブジェクトは内部リンケージを持ちます。 これは、それらがこのように使用されることを意図しているからです。

// a.cpp
const int BUFSIZE = 100; char abuf [BUFSIZE];

// b.cpp
const int BUFSIZE = 256 int bbuf [BUFSIZE];


6


Cで

もちろん、Cでは、リンケージを制御するためのstaticの使用は推奨されていません。無名ネームスペースを使用して、Cの内部リンケージをシミュレートすることができます。

Cのconst変数はプリプロセッサ定数を置き換えることになっていました - そしてプリプロセッサ定数はそれらを定義するファイルでのみ見えるので同様に、constはそれを定義するファイルでだけ変数を自動的に見えるようにします。


5


Constとstaticは、CとCの両方で直交する概念です。

`+ const +`キーワードは、変数が式の左辺値として表示されないようにコンパイラーに指示します-基本的に読み取り専用にします。

Cでは、 `+ static `キーワードには、適用対象に応じていくつかの用途があります。 関数の変数に適用すると、その変数が関数のローカルスコープに格納されていないが、それを呼び出してもアクセスできることを示します。 グローバル変数または関数に適用されると、特定のファイルからのみアクセス可能になります。つまり、コンパイル単位内でのみアクセス可能になります(「 extern +」が宣言されていない限り)。

C では、クラス定義内で「+ static +」キーワードを使用して、各インスタンスにローカルではなく、クラスのすべてのインスタンスで変数または関数を_shared_にすることができます。 さらに、Cの静的クラス関数は、そのクラス(またはアクセス権を持つクラス)の静的変数にのみアクセスできます。 現在、C では、「+ const 」はメンバーが明示的に「 extern +」と宣言されていない限り、メンバーにコンパイル単位への内部リンクを提供します。 これにより、ヘッダーファイルを使用してコンパイル時定数をユニット間で共有できます。 ただし、メンバーは実際には静的ではなく、定数は参照されている各場所にコンパイルされています。


3


*これらの概念は直交しています*ので、同じものと考えるべきではありません。

Constnessはアクセスの妥当性です。それはあなたの変数が読み取り専用(const)か書き込み - 読み取り(constでない)であるべきかを告げるだけです。

静的性は寿命(および技術的にはメモリローカライゼーション)の特性です。 : it tells if the variable will be global in the scope of a class (when クラス内)または変換単位(cppで定義されたグローバル変数と共に使用される場合)。


-2


そうではありません。最も明白な例は、constメンバー変数(もちろんコンストラクターによって初期化される)がある場合、それはそのクラスのすべてのオブジェクトによって共有されるのではなく、それぞれに個別のものであるということです。

クラスA {public:A(int newx):x(newx);プライベートint x。 }

litbが上記の最良の答えを出します。


-4


そうではありません。 次のように書いてください。

const int i = 0;

(CまたはC +で) ` i +`を静的にしません。