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