我在 .cpp 中有一个代码
namespapce A
{
namespace
{
static CMutex initMutex;
}
void init()
{
//code here
}
void uninit()
{
//code here
}
}
如果我删除互斥锁中的静态并且如果存在静态有什么不同?静态有什么用?
谢谢!
如果互斥锁是静态的,并且如果它位于标头中并且该标头包含在 2 个 cpp 文件(2 个翻译单元)中,则第一个文件中的代码应用的锁将不会被第二个文件看到,这是危险的。这是因为 2 个单元具有互斥锁的单独静态。在这种情况下,最好使用全局互斥锁。
如果这是 C++,那么使用 RAII 机制来管理互斥锁和解锁。这是c++,类在哪里?将事物封装到一个类中。
RAII 例子(基础一,东西可以封装成类): http ://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
static 只做两件事:
使变量在程序的整个生命周期中都存在(但这是全局级别的,所以这里的任何东西都存在于整个程序生命周期中!)
使变量仅在声明它的翻译单元中可见(但这适用于匿名命名空间中的任何内容)。
所以,事实上,在这个特定的上下文中,static 什么都不做。
你有点混淆了C和C++。C 中的关键字static
旨在将变量的范围缩小到翻译单元。您可以在翻译单元中全局定义它,但它对其他翻译单元不可见。Bjarne Stroustrup 建议namespaces
在 C++ 中使用匿名而不是在 C 中使用static
like。
从这篇文章中它说
C++ 标准在第 7.3.1.1 节未命名命名空间,第 2 段中写道:
The use of the static keyword is deprecated when declaring objects
in a namespace scope, the unnamed-namespace provides a superior alternative.
静态仅适用于对象、函数和匿名联合的名称,不适用于类型声明。