Re: [問題] 一個專案使用兩種namespace

作者: LPH66 (-6.2598534e+18f)   2015-06-08 02:04:10
仔細看了一下你的敘述我發現了一個很大的問題:
InstantAI.h 裡面使用了 using namespace
一般來說 header file 裡不應該宣告全域的 using 敘述
因為這會造成所有引入這個標頭檔的檔案強迫把所 using 的東西給打開
(這有個名詞叫 namespace pollution, 命名空間污染)
在這裡你的 InstantAI.h 裡的宣告污染到了主程式
然後因為 Automation::BDaq 下面大概也有一個 uint8
(全名 Automation::BDaq::uint8)
但 winsock 裡的 uint8 是全域的 (全名 ::uint8)
而它的 macro 也許是展開成不帶 :: 的 uint8
造成編譯器看到不帶 :: 的 uint8 時找到了這兩個候選人
但他不知道你是指誰 (因為 Automation::BDaq::uint8 被 using 打開了)
所以就噴 C2872
沒理解錯的話 InstantAI.h 應該是你自己寫的檔案
這樣的話有兩個方法, 一個治標, 一個治本
治標法是把 InstantAI.h 裡那兩行 using namespace 移到 Datareadfunction() 裡面
這樣那就是函式區塊裡才有 using namespace 的效果
於是函式外面的 uint8 就只看得到 winsock 定的 ::uint8
治本法是你就不要留函式實作在 .h 裡了, 留宣告就好
另外開一個 .cpp 寫 Datareadfunction()
using namespace 什麼的也移去那邊
最後編譯完再把兩個檔案連結起來
這樣兩個 .cpp 是各自的編譯單位, 誰都不會影響誰
作者: t78923t (トースト)   2015-06-08 03:43:00
所以治本的辦法是將副程式改放在.cpp檔裡面 而不放在.h檔然後用主程式(寫在.cpp檔裡)去呼叫改寫在另一個.cpp檔裡的副程式Datareadfunction()?也就是把原本用.cpp呼叫.h檔的方式改成用.cpp呼叫.cpp檔?
作者: Killercat (殺人貓™)   2015-06-08 05:15:00
er...聽起來你要include cpp?這是大忌喔
作者: linotwo (._.)   2015-06-08 10:16:00
include 只是單純把程式碼串在一起而已串好的程式碼拿去編譯出來的目的檔就算呼叫未定義的函式編譯也不會有問題因為在連結並產生執行檔的階段,linker會試圖去解決兩個 CPP 檔意味著將會產生兩個目的檔而其中一個檔內的主程式會去呼叫另一個檔內的副程式
作者: anyoiuo   2015-06-08 11:16:00
global, namespace都有相同的typdef應該不會有問題才對http://ideone.com/Oze0ZM 像這樣也都不會有錯誤出現Ambiguous比較像Killercat提到的相同名稱有不同定義像http://ideone.com/RSRQFd,此時只須明確定義要使用哪個namespace底下的uint8即可(XXXX::uint8 ...)。應該盡量避免將副程式寫在header檔裡,用前面說的header+cpp,h檔宣告prototype,cpp進行實作後linker會幫你處理。
作者: t78923t (トースト)   2015-06-08 12:08:00
各位指的意思是 兩個.cpp檔不須互相include 只需要在專案各位指的意思是 兩個.cpp檔不須互相include 只需要在專案設定裡設定Linker副程式 然後主程式加上Datareadfunction() 就好了嗎?
作者: anyoiuo   2015-06-08 13:09:00
假設你main要使用void func(int a), 這時有三個檔案main.cpp xxx.h xxx.cpp, main include xxx.hxxx.h寫function protype, void func(int a);xxx.cpp對func進行實作, void func(int a) { //todo }但Ambious symbol問題還是可能存在,記得當type在不同namespace下都有定義且定義為不同的對象時,要明確指定你要使用哪個namespace下的,ex.Automation::BDaq::uint8 x不然編譯器看到他是A同時又是B會不知怎辦。話說那行MACRO在windef.h長這樣((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))所以你拆開測ok嗎?
作者: t78923t (トースト)   2015-06-09 22:22:00
anyoiuo大的方法看的不是很懂...進行實作的意思指的是編譯(build)?
作者: LPH66 (-6.2598534e+18f)   2015-06-10 01:19:00
關鍵字: 多檔編譯, 再加上你所用的 IDE 下去 google

Links booklink

Contact Us: admin [ a t ] ucptt.com