2016-09-29 35 views
0

我今天早上在工作中遇到了一些奇怪的事情,我真的需要談論它,我在頭文件中的一個未命名的名稱空間中有一個字符串對象,最後一個包含在主要的cpp文件和其他cpp文件。全局字符串在收到非空內容後保持空白

在main()中,我注意到當這個全局字符串對象使用它的=運算符來設置函數返回的值(一個非空字符串)時,它保持爲空!而如果我通過本地字符串更改全局字符串,則最後一次使用新內容正確更新。我記得遇到來自全局變量的奇怪行爲,我真的想知道發生了什麼。這就像編譯器沒有正確編譯程序...

是否有一些人遇到類似於全局變量的東西,並理解發生了什麼?

我解決了這個問題,用一個類來代替未命名的命名空間,並在其中聲明瞭靜態字符串。

+0

你可以發佈一些代碼給你的問題更多的上下文。 – Alex

+0

我需要重現這個問題,我將在明天完成 – Aminos

+5

「我在頭文件**中的一個未命名的名稱空間**中有一個字符串對象」 - 然後,您爲每個包含該變量的文件都有一個單獨的副本標題。 – user2357112

回答

2

不要在頭文件中使用未命名空間。

未命名的命名空間將爲其包含的每個文件創建一個新的匿名命名空間,並且一個未命名的命名空間只能在文件中出現一次,因此只能使用一個具有未命名命名空間的標頭。

使用命名的命名空間或類(就像你在你的問題中提到的)會更好。

+0

還有「extern」關鍵字可以幫助... – Aminos

+0

我的團隊成員在今天有這個問題,他的常量是在一個命名空間。最終幫助的是'constexpr' –

+0

@GioraGuttsait:使用'constexpr' **掩碼**的錯誤,但沒有解決它。如果要在編譯單元之間共享一段數據,只需在頭文件中聲明**(使用'extern'說明符),然後在單個編譯單元中定義它。 – IInspectable