2016-11-01 9 views
4

私はすべての文字列を格納する "Common.h"ファイルをプロジェクト全体で再利用しています。コンパイル時にターゲットに含まれていない.hファイルはどうなりますか?

include "Common.h" 

、その後、私は私が使用する文字列が必要です:今、私はXcodeで気づい

Common::mystring 

namespace Common{ 
    static const std::string mystring = "IamAwesum"; 
} 

だから、特定の文字列を必要とするすべてのファイルに私は、ファイルを含めます「.h」ファイルのどれもがターゲットに含まれていないことを示します。しかし、私のプログラムは期待通りにうまくいくようです。誰かが.hファイルに何が起こるか説明できますか?これはどのように作動しますか ?それは "include" "Common.h"ファイルにすべてのデータのコピーがあるからですか?

+0

この場合、静的な文字列がグローバルであることに注意してください。だから彼らはいつでも例外を作り出すことができ、捕まえることはできません。私はあなたの文字列の参照を返す関数を使用することをお勧めします。 'std :: string const&mystring {静的std ::文字列const mystring =" IamAwesum "; return mystring} 'このようにして、オブジェクトは必要なときにのみ構築されます。 – Stargateur

+0

いつでも例外を作成できると言ったときの意味を説明できますか? –

+0

[優れたpdfはこちら](https://www.nsnam.org/docs/linker-problems.doc)グローバルコンストラクタは、メインの前にプログラムの先頭で呼び出され、例外を処理することはできません。ライブラリがロードされたときにグローバルコンストラクタを持つライブラリを実行する場合は、グローバルオブジェクトがビルドされているときに例外を処理できます。そして、ライブラリがロードされたときに例外を処理する方法はありません。そして、この問題は、ユーザーにとって見つけにくいものになります。 – Stargateur

答えて

3

ヘッダーはコンパイルされません(あらかじめコンパイルされたヘッダー、一般的なビルド最適化テクニック、間違いなど)が、代わりにOP疑いのあるものとして、それらを使用するファイルにコピーされます。 C++標準

から

[cpp.include]形態

# include"Q-チャー配列"改行

原因の前処理指令指定されたシーケンスによって識別されるソースファイルの内容全体によるそのディレクティブの置き換え "区切り文字。

添付ファイルは、#includeディレクティブがコンパイル中のファイルに貼り付けられ、#includeの代わりに使用されます。

ファイルがではなく、が含まれていると、それは決してコンパイルされているファイルに置換されず、絶対にファイルに何も起こりません。

インクルードされたファイルは、プロジェクト、ターゲットメイクファイル、またはwhat-have-youのどこにでもリストする必要はありません。ファイルをインクルードすることは、インクルードするヘッダを探す場所のリストがソースコードからツールチェーンとライブラリを抽象化するために存在することが多いが、これを含むcppファイルに厳密に従う。

関連する問題