Re: [問題] 請問兩個語法的問題

看板C_and_CPP (C/C++)作者時間15年前 (2010/09/20 22:28), 編輯推噓4(4034)
留言38則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《selection ()》之銘言: : 最近讀書遇到兩個語法上的問題: : (一)if裡面出現逗號 : (二)::的使用 : ex: : HINSTANCE hComponent = ::LoadLibrary(name); : ........................................... : CREATEFUNCPTR CreateInstance : = (CREATEFUNCPTR)::GetProcAddress(hComponent, "CreateInstance"); : //書名: Inside COM : 1. std::cout //cout隸屬在std這個namespace下 : 2. SomeClass::someMemberFunction //SomeMemberFunction隸屬在SomeClass之下 : 3. ::someGlobalVariable //在區域使用域內,存取相同名稱的全域變數 : 4. SomeClass::somePublicStaticVariable //在類別外存取public static variable : 5. SomeBaseClass::someBaseClassFunction //衍生類別呼叫基本類別的成員函式 : 6. using SomeBaseClass::someBaseClassFunction //推翻C++對繼承而來的名稱的預設 : 遮掩行為(effective C++) : 在ex裡的例子不符合以上我說的六個用法,::後面接的是函式非變數,所以我實在搞不懂 : 為什麼要加上::,希望有熱心版友解答一下,謝謝! 有板友說第二個問題就是3的情況,只是變數改成函式,但是我說的3的情況是因為在區域使 用域上有一個變數和全域使用域的變數同名,故才要用::,否則的話不需::就可直接存取全 域使用域的變數了. 但是函式本來就是全域了,又不是有類別包在外面(那就是成員函式了),而且也沒有同名的 函式,為什麼要用::? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.227.132.215 ※ 編輯: selection 來自: 125.227.132.215 (09/20 22:28) ※ 編輯: selection 來自: 125.227.132.215 (09/20 22:29)

09/20 22:29, , 1F
你看到那種用法 沒有被包在成員函式裡嗎?
09/20 22:29, 1F

09/20 22:41, , 2F
加了::這個就一定是全域,就像打全名一樣,不論有無必要性
09/20 22:41, 2F

09/20 22:42, , 3F
都比不加::還要明確
09/20 22:42, 3F

09/20 22:42, , 4F
GetProcAddress和LoadLibrary好像是window.h的全域函式
09/20 22:42, 4F

09/20 22:45, , 5F
2 樓忘記 unnamed namespaces 喔! 這樣的寫法可以比較
09/20 22:45, 5F

09/20 22:46, , 6F
清楚被呼叫的個體是哪一個, 避免產生混淆, 或模棱兩可
09/20 22:46, 6F

09/20 22:51, , 7F
unnamed namespaces我知道是什麼,但我還是看不懂樓上
09/20 22:51, 7F

09/20 22:51, , 8F
的推文@@
09/20 22:51, 8F

09/20 22:51, , 9F
就是二樓講的 還要加上 namespace{}這可能性
09/20 22:51, 9F

09/20 22:55, , 10F
所以就是說在沒有同名的變數/函式時,可以寫或不寫::?
09/20 22:55, 10F

09/20 22:55, , 11F
都是可以的,只是寫了比較清楚?
09/20 22:55, 11F

09/20 22:56, , 12F
另外沒考慮到unnamed namespaces又是什麼意思?
09/20 22:56, 12F

09/20 22:58, , 13F
而且函式本來就不可能同名阿,這裡是指全域函式非成員函
09/20 22:58, 13F

09/20 22:58, , 14F
09/20 22:58, 14F

09/20 22:59, , 15F
阿不對,函式可以包在namespace裡面,所以可能同名
09/20 22:59, 15F

09/20 23:00, , 16F
就算不包也可以同名, 因為有 overloading 這機制
09/20 23:00, 16F

09/20 23:08, , 17F
我知道overloading,但是我還是覺得就我提到的例子,我還
09/20 23:08, 17F

09/20 23:08, , 18F
是覺得沒必要在全域函式前加::
09/20 23:08, 18F

09/20 23:10, , 19F
為什麼加了::可避免混淆?
09/20 23:10, 19F

09/20 23:14, , 20F
謝謝love大指正。給原PO看:http://codepad.org/3OWqKIXc
09/20 23:14, 20F

09/20 23:15, , 21F
在很多情況下不加 :: 仍然會對 但是加上 :: 能夠更清楚
09/20 23:15, 21F

09/20 23:22, , 22F
嗯,purpose的例子很有趣,若去掉local variable foo就不
09/20 23:22, 22F

09/20 23:23, , 23F
會foo()造成compile error,但是有了區域變數,就得加::
09/20 23:23, 23F

09/20 23:25, , 24F
但是unnamed namespace的範圍只在file裡,其他檔案又不會
09/20 23:25, 24F

09/20 23:26, , 25F
用裡面的東西,purpose的例子是因為同一檔案,否則的話我
09/20 23:26, 25F

09/20 23:26, , 26F
還是想不透什麼時候不加::會錯...
09/20 23:26, 26F

09/20 23:29, , 27F
這只是外面的 foo(函式名稱)會被區域的foo(變數名稱)
09/20 23:29, 27F

09/20 23:30, , 28F
隱藏起來而已
09/20 23:30, 28F

09/20 23:32, , 29F
全域變數被區域變數隱藏起來不會編譯錯,但函式名稱被區
09/20 23:32, 29F

09/20 23:33, , 30F
域變數名稱隱藏起來會compile error,除非你加::
09/20 23:33, 30F

09/20 23:34, , 31F
還有如果加上全域變數foo那行,好像就沒有辦法呼叫unname
09/20 23:34, 31F

09/20 23:34, , 32F
namespace裡的foo了?
09/20 23:34, 32F

09/20 23:36, , 33F
重點是你如何去使用那個名稱, 而不是被隱藏以及隱藏別
09/20 23:36, 33F

09/20 23:36, , 34F
人的東西是不是函式
09/20 23:36, 34F

09/20 23:47, , 35F
不要看一個例子學一樣東西, 否則自己下結論也有可能下
09/20 23:47, 35F

09/20 23:48, , 36F

09/20 23:49, , 37F
先搞懂編譯器在面對這類行為時會做什麼決策, 再去看程
09/20 23:49, 37F

09/20 23:50, , 38F
式碼會比較好
09/20 23:50, 38F
文章代碼(AID): #1CbszrgY (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CbszrgY (C_and_CPP)