変数宣言がヘッダーファイルの静的ではありませんか?

StackOverflow https://stackoverflow.com/questions/92546

  •  01-07-2019
  •  | 
  •  

質問

場合のリファクタリングから #defines って宣言を以下のようにC++ヘッダファイル:

static const unsigned int VAL = 42;
const unsigned int ANOTHER_VAL = 37;

の問題であり、どのような違いる場合、これまでの静か。注複数の有のヘッダをなすことができ、クラシック #ifndef HEADER #define HEADER #endif トリックの場合となり

の静的均一つのコピー VAL 作成した場合、ヘッダを含む複数のソースファイルとは何ですか?

役に立ちましたか?

解決

static があることを意味する一つのコピー VAL 作成した各ソースファイルが含まれます。るとともに、複数の介在物でもないことから、複数の定義 VAL る衝突させるリンク。Cはなく、 static することを確実にしなければならな唯一のソースファイル定義 VAL の他のソースファイルで宣言された extern.普通うことを定義すると初期化子)のソースファイルの extern 宣言がヘッダファイルです。

static 変数のグローバルレベルに見る自分のソースファイルかどうかにあり介したものではありましたのファイルです。


編集部注: C++では、 const オブジェクトのもの staticextern キーワードを宣言は、暗黙のうちに static.

他のヒント

staticextern タグファイル-scoped変数にするかどうかを判定するのでアクセス可能その他の翻訳単位(その他 .c または .cpp まります。

  • static の変数内の連携を隠するようになりますので、翻訳単位です。しかし、変数の社内連携で定義された複数の翻訳です。

  • extern の変数の外部連携で見えるその他の翻訳です。通常、この変数のみで定義された一つの翻訳ます。

デフォルトした場合を指定しない static または extern 一つの分野で、CとC++に異なります。

  • Cファイル-scoped変数 extern (外部リンク)がデフォルトです。使用している場合は、C VALstaticANOTHER_VALextern.

  • C++では、ファイル-scoped変数 static 内部連携)の場合は、デフォルトのもの const, は、 extern デフォルトしないという方針といったを使用している場合、C++、 VALANOTHER_VALstatic.

からの C仕様:

6.2.2連の識別子 ...-5-の場合は宣言の識別子の機能は、スクラスの指定子は、その連携 定どおりにこの宣言の保存-クラス指定子extern.の場合 この宣言の識別子オブジェクトのファイルの範囲およびスクラスの指定子 その連携がます。

からの C++仕様:

7.1.1-保存のクラス指定子[dcl.stc] ...-6-名で宣言された名前空間範囲な保管-クラス指定子は、外部連携がない限り社内連携での前の宣言で宣言されていませんconst.オブジェ宣言された定数は明示的に宣言されexternて社内連携です。

の静的または"いよいよプレゼンテーションコピーしたファイルがないので完全に法律です。簡単に試験この小さなサンプルコード:

テストです。h:

static int TEST = 0;
void test();

test1.cpp:

#include <iostream>
#include "test.h"

int main(void) {
    std::cout << &TEST << std::endl;
    test();
}

test2.cpp:

#include <iostream>
#include "test.h"

void test() {
    std::cout << &TEST << std::endl;
}

こすこの出力:

0x446020
0x446040

const 変数をC++でい内部の連携です。なので、使用 static しても、何の効果もありません。

a.h

const int i = 10;

one.cpp

#include "a.h"

func()
{
   cout << i;
}

two.cpp

#include "a.h"

func1()
{
   cout << i;
}

このたCプログラムしています多重定義'エラーのための i より外部連携).

の静的な宣言でこのレベルのコードのvariabelが見える現在の作成ユニットです。このことのみをコードするモジュール参照に変更します。

またヘッダファイル変数を宣言する静的およびそのヘッダが含まれる複数のC/CPPファイル、そして変動する"地域"をモジュールがありますNのコピーと変数の場所はそのヘッダが含まれます。彼らは相互に関係していない。任意のコード内の他のソースファイルのみ、参照変数の宣言されるそのモジュールです。

この場合に'static'キーワードないように提出された個人ます。ことがございました何かが足りないもののようで問いません--は見たことがありませんもこう。

てinlining、この場合、変数がinlinedが、これは当たり前のことで宣言されたconst.のコンパイラ がインラインモジュールの静的変数は、その状況とのコードを取りまとめを行いました。しないという保証はありませんのでコンパイルすインライン'統計'.

C書(無料オンライン)の章のリンクについて説明するの意味に'static'詳細は、正しい答えが与えられその他のコメント):http://publications.gbdirect.co.uk/c_book/chapter4/linkage.html

回答の際に,静的の一つで、コピーのVALを作成する場合、ヘッダを含む複数のソースファイルとは何ですか?"...

NO.VAL常は、別に定める毎にファイルのヘッダを表します。

基準のCおよびC++な原因は違います。

Cファイル-scoped変数externデフォルトです。使用している場合は、C、VALが静的およびANOTHER_VALはextern.

ご注意現代の配合に苦情をANOTHER_VALの場合はヘッダが含まれ異なるファイル(グローバルに定義され、会社エクスペディア訴えばANOTHER_VALたinitialised異なる価値を別のファイル

C++では、ファイル-scoped変数は静的デフォルトであればconst、externによるデフォルトしないという方針といった使用している場合は、C++の両方のVAL、ANOTHER_VALしております。

まもという事実を踏まえる必要があり、この両方の変数に指定されconst.理想的にコンパイラは常に選択インラインこれらの変数とな保管します。が全体の理由を保存できる割り当てられてしまいます。いものを考えることができる...

  • デバッグオプション
  • アドレスのファイル
  • コンパイラは常に割り当て保管(複合定数の種類できない簡単にできinlinedような特別な場合のための基本データ型)

できないと静的変数を定義することなく、えて下さり困ることはなかった(これは、保存のクラス修飾子の静的およびexternが相互に専用).静的変数で定義されるヘッダーファイルが、このように各ソースファイルのヘッダファイルへの民間のコピーを可変することで、あなたに何をします。

ることを宣言し、グローバル範囲(なメンバ変数)とします。

静的 と社内連携'.このような場合、で宣言された const これを最適化する/inlinedのコンパイラです。拡張子を省略した場合は const その後、コンパイルに配置保存毎に作成ユニットです。

を省略 静的 の連携が extern デフォルトです。まだ救われている constらしさをコンパイラで最適化/インラインです。が入った場合に const を取得します multiply defined記号 エラーのリンク。

const 変数はデフォルトの静的なC++でもextern C.でご利用の場合はC++のこなどの建設を利用します。

(7.11.6C++、2003年Apexndix Cがサンプル)

例に比べコンパイル/リンク源としてのCおよびC++プログラム:

bruziuz:~/test$ cat a.c
const int b = 22;
int main(){return 0;}
bruziuz:~/test$ cat b.c
const int b=2;
bruziuz:~/test$ gcc -x c -std=c89 a.c b.c
/tmp/ccSKKIRZ.o:(.rodata+0x0): multiple definition of `b'
/tmp/ccDSd0V3.o:(.rodata+0x0): first defined here
collect2: error: ld returned 1 exit status
bruziuz:~/test$ gcc -x c++ -std=c++03 a.c b.c 
bruziuz:~/test$ 
bruziuz:~/test$ gcc --version | head -n1
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609

静の他の編集部からexterning変動のコンパイラで"インライン"の変数の値が使用されないの作成メモリに保存します。

お二つ目の例では、コンパイラを想定することはできないその他のソースファイルなexternすなわち社会的価値を実際に店する価値の記憶どこかということです。

静的にコンパイラからの複数のう場合がございます。これが重要なのは#ifndef保護のもとにヘッダが含まれて二つの別の図書館のリンクは、インスタンスが含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top