C_and_CPP 板


LINE

※ 引述《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 ([email protected]) 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)
1F:推 QQ29:谢谢T大观念解惑!! 09/05 23:25







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP