2016-09-29 10 views
0

今朝私の仕事で奇妙なことが起こりました。私は本当にそれについて話す必要があります。ヘッダーファイルの名前のない名前空間に文字列オブジェクトがあります。メインのcppファイルと他のcppファイルにあります。空でないコンテンツを受け取った後にグローバル文字列が空のままになる

main()では、このグローバル文字列オブジェクトが=演算子を使用して関数(空でない文字列)から返された値を設定しているときに気づきました。一方、グローバル文字列をローカル文字列で変更すると、この最後の文字列は新しいコンテンツで正しく更新されます。私はグローバル変数からの奇妙な振る舞いに遭遇したことを思い出し、何が起こっているのか本当に知りたい。コンパイラがプログラムを正しくコンパイルしなかったようです...

グローバル変数と似たようなことに遭遇し、何が起こったのか理解している人がいますか?

名前を付けられていない名前空間をクラスでrepalcingし、その内部に文字列staticを宣言することで問題を解決しました。

+0

あなたの質問に文脈を与えるためにいくつかのコードを投稿できますか? – Alex

+0

私はこの問題を再現する必要があります。明日は – Aminos

+5

"名前のない名前空間の文字列オブジェクト**をヘッダーファイルに入れました**" - この変数の別のコピーが含まれていますヘッダー – user2357112

答えて

2

ヘッダファイルに無名の名前空間を使用しないでください。

名前のない名前空間は、含まれるファイルごとに新しい名前空間を作成します。名前のない名前空間はファイルに1回しか表示できないため、名前のない名前空間を持つヘッダーは1つしか使用できません。

あなたの質問に言及したように、名前付きの名前空間またはクラスを使用するとうまくいくでしょう。

+0

また、 "extern"というキーワードがあります。 – Aminos

+0

私のチームメンバーは、今日この問題を抱えていて、彼の定数は名前空間にありました。最終的に 'constexpr'を助けたのは –

+0

@GioraGuttsait:' constexpr'を使うと**バグをマスクしますが、解決しません。コンパイル単位でデータを共有したい場合は、ヘッダーに 'extern'指定子を使って**宣言し、コンパイル単位で定義します。 – IInspectable

関連する問題