相关疑难解决方法(0)

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

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

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

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

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

c++ namespaces

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

命名空间中的静态变量与非静态变量

我有一个foo包含整数的命名空间bar,声明如此...

foo.h中:

namespace foo {
    int bar;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我foo.h只包含一个文件,这就可以了.但是当我foo.h从两个或更多文件中包含时出现问题:我收到链接器错误.我想出如果我声明barstatic,我可以包含foo.h在多个文件中.这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量.(那有什么意思?)

为什么这样做?更重要的是,为什么没有它的工作没有 staticstatic在用于什么时意味着什么namespace

c++ static namespaces

37
推荐指数
3
解决办法
2万
查看次数

如何断言std :: mutex是否被锁定?

使用GCC 4.8.2(在Linux/Debian/Sid 64位上) - 或GCC 4.9(如果可用) - 在C++ 11中 - 我有一些互斥锁

std::mutex gmtx;
Run Code Online (Sandbox Code Playgroud)

实际上,它是一个static在一些类构件Foo含有alphabeta以下的方法.

它被锁定在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不存在......我该如何定义它?(实际上我想确保某个[间接]调用者将互斥锁锁定在同一个线程中...)

(我想测试的原因assertbeta可以在其他地方调用)

我不能使用try_lock …

c++ linux gcc c++11

23
推荐指数
3
解决办法
2万
查看次数

标签 统计

c++ ×3

namespaces ×2

c++11 ×1

gcc ×1

linux ×1

static ×1