Re: [問題] static global 變數 跟 無名的namespac …

看板C_and_CPP (C/C++)作者 ( )時間16年前 (2009/09/05 04:04), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : ※ 引述《tinlans ( )》之銘言: : : 如果你有使用一些 library 所以 #include 了一堆 header files, : : 你用 global static 還是可能跟它的名稱發生衝突, : : 像是 basename() 這東西在 <libgen.h> 有宣告, : : 你如果自己寫的 code 有定義一個 local 的 basename(), : : 那就會出現宣告式/定義式不一致的 error (一個有 static 一個沒有就會 error), : : 你用 anonymous namespace 就不會有這問題。 : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : T大您好 : 針對這個我去測試一下 : VC8 : 我在.h寫 namespace {void foo(){}} : .cpp那邊 : 再次定義 void foo(){} : main裡面呼叫foo就會 compile error說 : 模稜兩可的呼叫多載函式 : 兩個問題請教 : 1. 為啥出錯是在呼叫foo才會錯 : 我不呼叫 難道他就不編譯嘛?? : 不是很了解原理@@ 本來就是呼叫才會錯, anonymous namespace 跟 global 又不是同個 namespace, 只是在呼叫的時候會同時看見而已, 不代表不能這樣寫; 因為 main() 同時間看到兩個 foo(), 你沒有指定要呼叫誰當然會出現 ambiguous。 正常狀況來說不會有人這樣寫, 因為會起名稱衝突的大都是來自 library, library 提供的大都是功能簡單的小函式, 一般來說不可能會直接被 main() 使用, 所以通常會有一個更大的函式也被放在 anonymous namespace 裡, 然後這個大函式會被 main() 直接呼叫, 比方說: namespace { void Action1() { ... } void Action2() { ... } void Action3() { ... } void BigFunction() { Action1(); Action2(); Action3(); } } int main() { BigFunction(); } 一般來說 BigFunction 的命名很難取到跟 library 衝突, 會衝的通常都是更底層的小 function, 所以這樣寫就能自然迴避上述的 ambiguous 問題, 你就算在 global 裡面也放了 Action1() 的宣告式或定義式, BigFunction() 還是會呼叫到 anonymous namespace 的 Action1(), 不過前提是至少 local 版的 Action1() 宣告式有出現在 BigFunction() 定義式之前, 否則還是會有意外。 總之你的問題在實際的程式幾乎不會遇到。 : 2. 我這測試是否是您說的情況 我說的情況是假設某個 library 提供的 header 長這樣: // lib.h ... void foo(); // 等同 extern void foo(); ... 然後你自己寫的某個檔案長這樣: #include "lib.h" static void foo() { ... } 這樣是無法通過編譯的, 因為 lib.h 裡面是 extern 而你自己寫的檔案又把標上 static, 所以就會 error, 但是這時候你寫成這樣就不會有事: #include "lib.h" namespace { static void foo() { ... } } 當然如果是你一開始舉的那種小例子還是會有 ambiguous 的問題, 可是只要寫程式的習慣良好就不會遇上那種事, 小測試遇上是難免的, 不然除非是有一個 function 就塞 10 萬行 code 的習慣, 這種人才比較有機會遇上你前面描述的問題。 -- Ling-hua Tseng (uranus@tinlans.org) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: https://www.tinlans.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.109.33 ※ 編輯: tinlans 來自: 118.160.109.33 (09/05 04:06)

09/05 23:25, , 1F
謝謝T大觀念解惑!!
09/05 23:25, 1F
文章代碼(AID): #1AeNBKxP (C_and_CPP)
文章代碼(AID): #1AeNBKxP (C_and_CPP)