18

static キーワードは、グローバル変数のスコープをその翻訳単位に限定します。.h ファイルで使用 static int xし、その .h ファイルを他のすべてのファイルに含めると、それらはすべて同じ翻訳単位に属しませんか? では、どこにでも x が表示されるのではないでしょうか? では、今の static の役割は何ですか?

また、static const int xx がグローバル変数である場合、の使用はありますか? すべての const グローバル変数はデフォルトで静的ではありませんか? また、const 変数のスコープは、ファイル内の for ループに限定されていても、TU に限定されますか?

4

6 に答える 6

49

あなたが書くなら

static const int x

.hファイルでは、 #include -sthis.hを持つすべての変換ユニットに独自のプライベート変数がありますx

1つのグローバル変数をすべての人に表示したい場合は、次のように記述します。

extern const int x;

.hファイルと

const int x = ...;

.cppファイルの1つ。

静的定数intを1つの変換単位だけに表示したい場合は、.hファイルでそれについて言及しないでください。

于 2012-08-15T10:20:05.437 に答える
7

.h ファイルで static int x を使用し、その .h ファイルを 1 つおきのファイルに含めると、それらはすべて同じ翻訳単位に属しませんか?

何かを static として宣言した場合 (クラスの static キーワードのセマンティックが異なるため、クラス内ではありません)、その静的変数はその TU の外では見えません。したがって、ヘッダー ファイルに配置すると、そのヘッダーを含む各 TU がその静的変数の異なるプライベート コピーを持つことになります。

また、const 変数のスコープは、ファイル内の for ループに限定されていても、TU に限定されますか?

番号。static const 値の場合でも、スコープはその宣言によって決定されます。したがって、スコープは for ブラケットによって制限されます。

于 2012-08-15T10:17:58.493 に答える
3

変換ごとにその変数のプライベート コピーが作成されることになり、そこに置くと肥大化します。また、あちこちにランダムにコピーする必要もありません。いいえ、大丈夫ではありません。

ブロックconst int内で aを宣言できます。namespaceそれで大丈夫です。

于 2012-08-15T10:15:53.327 に答える
2

const修飾された変数の目に見える違いは、staticバージョンでは翻訳単位ごとに 1 つのコピーが取得されるため、そのような 2 つのコピーのアドレス比較が失敗する可能性があることです。

変数のアドレスを使用しない場合、const最新のコンパイラは値を使用して変数自体を最適化できるはずです。そのような場合、static const修飾された変数は完全に問題ありません。

于 2012-08-15T10:35:50.597 に答える
1

基本的に、各ソース ファイルとインクルードされたすべてのヘッダー ファイルが 1 つの翻訳単位です。したがって、ヘッダー ファイルに静的変数がある場合、ヘッダー ファイルが含まれる各ソース ファイル (翻訳単位) で一意になります。

于 2012-08-15T10:16:21.977 に答える