Re: [問題] const 變數在.h, undefined behavior?
我回文整理一下好了, 推文好像會越推越長
※ 引述《lovejomi (JOMI)》之銘言:
: https://www.fluentcpp.com/2019/07/23/how-to-define-a-global-constant-in-cpp/
: 偶然看到這篇,我其實覺得他寫錯
: 這部分
: Each file has its own version of焏. This is a problem for three reasons:
: it is undefined behaviour (objects must be defined only once in C++),
: ??????真的undefined嗎?有沒有什麼表格或網址整理ub...之前看到說把東西寫在
: namespace std也是ub...也太多很容易就寫出來的ub了吧
一個很令人沮喪的事實是 C++ 確實很多很容易寫出來的 UB...
: it uses more memory,
: if the constructor (or destructor) of曱温as side effects, they will be execute
: d twice.
: 這句看不懂,什麼是side effect在這裡?
: 他的範例我唯一能看出問題的就是你沒辦法保證cout比他的x先初始化
: 其他他說執行兩次cstor不是很正常嗎?
推
07/25 17:44,
07/25 17:44
→
07/25 17:45,
07/25 17:45
→
07/25 17:45,
07/25 17:45
→
07/25 17:48,
07/25 17:48
→
07/25 17:49,
07/25 17:49
One Definition Rule (ODR) 是 C++ 裡的一個很重要的概念
重要到標準裡有一個衍生詞叫做 "odr-used" 來形容一個東西
被如此形容的東西在整支程式的所有轉譯單元當中有且僅能有恰好一個定義
: 我只記得const自帶static,所以預設是internal linkage
: https://en.cppreference.com/w/cpp/language/cv
: 的Note也是這樣寫
: 但他說是ub 我覺得很奇怪…..
不過下面的回應好像有跟你一樣的問題:
qsvui ‧ 2 days ago
I'm not sure that your very first example of putting a const variable in the
header is undefined behavior.
他舉了跟你提到的同樣的段落表示怪怪的
: 最後他提到inline,
: inline跟extern效果一樣,意思是c++鼓勵使用inline而不是extern嗎
: 謝謝
→
07/25 17:50,
07/25 17:50
→
07/25 17:51,
07/25 17:51
→
07/25 17:51,
07/25 17:51
文中很明確的跟你說了:
With extern, the above code is a declaration, and not a definition. With
inline, it was a definition.
extern 只做宣告不做定義, 所以可以在各個不同轉譯單元當中同時存在
但是若它被 odr-used 那你就必須給它一個定義
因此你必須在其中一個轉譯單元中定義它
C++17 的 inline 變數跟以前的 inline 函數的概念頗像 (或者該說就是這樣延伸來的)
它能夠有多於一個定義, 只要大家的定義完全相同即可
所以在 C++17 我們可以像貼 inline 函數一樣為全域變數貼 inline
編譯器就知道這些在各個轉譯單元中宣告 inline 的變數是同一個東西而把它整合在一起
而由於這已經是個定義, 因此就無須特別在其中一個轉譯單元中定義之了
(反而這裡再多定義就違反 inline 的完全相同的約定, 那這就又是 UB 了)
--
有人喜歡邊玩遊戲邊上逼;
也有人喜歡邊聽歌邊打字。
但是,我有個請求,
選字的時候請專心好嗎?
-- 改編自「古 火田 任三郎」之開場白
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.3.123 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1564050073.A.CDC.html
推
07/25 18:49,
4年前
, 1F
07/25 18:49, 1F
推
07/26 11:43,
4年前
, 2F
07/26 11:43, 2F
推
07/26 12:02,
4年前
, 3F
07/26 12:02, 3F
→
07/26 12:02,
4年前
, 4F
07/26 12:02, 4F
推
07/26 17:39,
4年前
, 5F
07/26 17:39, 5F
→
07/26 17:40,
4年前
, 6F
07/26 17:40, 6F
→
07/26 17:43,
4年前
, 7F
07/26 17:43, 7F
→
07/26 17:45,
4年前
, 8F
07/26 17:45, 8F
推
07/26 17:52,
4年前
, 9F
07/26 17:52, 9F
→
07/26 17:53,
4年前
, 10F
07/26 17:53, 10F
推
07/27 09:49,
4年前
, 11F
07/27 09:49, 11F
→
07/27 09:49,
4年前
, 12F
07/27 09:49, 12F
→
07/27 09:49,
4年前
, 13F
07/27 09:49, 13F
其實說到 linkage
我在想會不會這種習慣/誤解有可能是因為在 C 語言這個是 external linkage 有關
同樣引用你舉過的那個地方:
> ... This is different from C where const file scope variables have external
> linkage.
在 C 的時代已經這樣理解/這樣被教導所以到了 C++ 照樣帶了進來這樣
不說別的, 我自己在仔細找過資料之前也有差不多的誤解...
※ 編輯: LPH66 (180.177.3.123 臺灣), 07/27/2019 12:49:42
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):