作者tinlans ( )
看板C_and_CPP
标题Re: [问题] static global 变数 跟 无名的namespac …
时间Sat Sep 5 04:04:34 2009
※ 引述《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