相关疑难解决方法(0)

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

变量具有内部链接但未定义

我有这个.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)

这有什么问题?

c++ linkage

8
推荐指数
1
解决办法
1万
查看次数

将结构放在匿名命名空间中的作用是什么?

可能重复:
为什么使用未命名的命名空间以及它们有什么好处?

查看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;

谢谢!

c++ oop namespaces object data-structures

4
推荐指数
1
解决办法
1974
查看次数

标签 统计

c++ ×3

namespaces ×2

data-structures ×1

linkage ×1

object ×1

oop ×1