C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
我有这个.h文件:
namespace{
class Invariant{
public:
Invariant(z3::expr e,Instruction *i):Expr(e),I(i){
DenseMap<Instruction*,Invariant*> FunMap = Invariants[F];
}
private:
//static map
static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants;
};
}//end of anonymous namespace
Run Code Online (Sandbox Code Playgroud)
当我编译clang说:
Invariant.h:46:65: warning: variable '<anonymous namespace>::Invariant::Invariants' has internal linkage but is not defined
static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants;
^
Invariant.h:26:48: note: used here
DenseMap<Instruction*,Invariant*> FunMap = Invariants[F];
Run Code Online (Sandbox Code Playgroud)
这有什么问题?
可能重复:
为什么使用未命名的命名空间以及它们有什么好处?
查看someones代码,这是他们声明的内容:
namespace {
struct myStruct {
int x;
int y;
} obj1;
}
Run Code Online (Sandbox Code Playgroud)
..在一个函数我看到它像这样使用:
myStruct& var = obj1;
Run Code Online (Sandbox Code Playgroud)
(注意namespace是匿名的.)
从我如何使用它,我无法弄清楚为什么它被声明和使用这样.
宣布这样做的做法有何不同?
另外,为什么指针是这样创建的而不是这里显示的传统样式.即myStruct*ptr;
谢谢!