C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
我有一个foo包含整数的命名空间bar,声明如此...
foo.h中:
namespace foo {
int bar;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我foo.h只包含一个文件,这就可以了.但是当我foo.h从两个或更多文件中包含时出现问题:我收到链接器错误.我想出如果我声明bar为static,我可以包含foo.h在多个文件中.这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量.(那有什么意思?)
为什么这样做?更重要的是,为什么没有它的工作没有 static?static在用于什么时意味着什么namespace?
使用GCC 4.8.2(在Linux/Debian/Sid 64位上) - 或GCC 4.9(如果可用) - 在C++ 11中 - 我有一些互斥锁
std::mutex gmtx;
Run Code Online (Sandbox Code Playgroud)
实际上,它是一个static在一些类构件Foo含有alpha与beta以下的方法.
它被锁定在alpha像
void alpha(void) {
std::lock_guard<std::mutex> g(gmtx);
beta(void);
// some other work
}
Run Code Online (Sandbox Code Playgroud)
我想检查beta确实gmtx是锁定的:
void beta(void) {
assert (gmtx.is_locked());
// some real work
}
Run Code Online (Sandbox Code Playgroud)
(注意is_locked只在内部调用assert......它可能非常低效甚至有时不准确)
当然,我还有其他函数调用beta,例如
void gamma(void) {
std::lock_guard<std::mutex> g(gmtx);
beta();
// some other work
}
Run Code Online (Sandbox Code Playgroud)
但is_locked不存在......我该如何定义它?(实际上我想确保某个[间接]调用者将互斥锁锁定在同一个线程中...)
(我想测试的原因assert是beta可以在其他地方调用)
我不能使用try_lock …