我在.cpp中有代码
namespapce A
{
namespace
{
static CMutex initMutex;
}
void init()
{
//code here
}
void uninit()
{
//code here
}
}
如果删除互斥锁中的静态并且是否存在静态,有什么不同?静态的用途是什么?
谢谢!
答案 0 :(得分:5)
如果互斥锁是静态的,并且它位于标题中并且该标题包含在2个cpp文件中(2个转换单位),则第一个文件中的代码所应用的锁将不会被第二个文件看到,这是危险的。这是因为2个单元具有互斥的单独静态。在这种情况下,最好使用全局互斥。
如果这是C ++,那么使用RAII机制来管理互斥锁和解锁。这是c ++,哪个类?将事物封装成一个类。
RAII示例(基本的,事情可以封装到类中): http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
答案 1 :(得分:2)
你有点混淆C和C ++。 C中的关键字static
旨在将变量的范围缩小到翻译单元。您可以在翻译单元中全局定义它,但其他翻译单元不可见。
Bjarne Stroustrup建议在C ++中使用匿名namespaces
,而不是像C中那样使用static
。
从this发帖说
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.
静态仅适用于对象,函数和匿名联合的名称,而不适用于类型声明。
答案 2 :(得分:2)
static只做两件事:
使一个变量在程序的整个生命周期中存在(但这是全局级别的,所以这里存在整个程序生命周期!)
使变量仅在声明的翻译单元中可见(但这适用于匿名命名空间中的任何内容)。
所以,事实上,在这个特定背景下 ,静态无效。