2013-04-05 52 views
2

间不同我在的.cpp静态Mutext和不是静态互斥

namespapce A 
{ 
    namespace 
    { 
     static CMutex initMutex; 
    } 

    void init() 
    { 
     //code here 
    } 

    void uninit() 
    { 
     //code here 
    } 
} 

一个代码,如果我删除的互斥静态什么是不同的,如果有一个静态的?静态的用途是什么?

谢谢!

+0

'namespace'是故意未命名的吗? – 2013-04-05 08:09:16

+1

我认为这是一个重复的:http://stackoverflow.com/questions/11623451/static-vs-non-static-variables-in-namespace – maditya 2013-04-05 08:10:14

+0

是的,它的匿名命名空间,以便其他代码不能使用它。 – domlao 2013-04-05 08:10:37

回答

2

你是一种混合C和C++。 C中的关键字static有意将变量的范围缩小到翻译单元。您可以在翻译单元中全局定义它,但其他翻译单元不可见。 Bjarne的Stroustrup的建议℃至使用匿名namespaces ++,而不是使用static像C.

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. 

静态仅适用于对象,函数和匿名联合的名称,不适用于声明类型。

5

如果互斥量是静态的,并且它已经在头文件中并且该头文件包含在2个cpp文件(2个翻译单元)中,则第一个文件中的代码应用的锁定将不会被第二个文件危险的。这是因为2个单位具有单独的互斥静态。在这种情况下,最好使用全局互斥锁。

如果这是C++,那么使用RAII机制来管理互斥锁和解锁。这是C++,班级在哪里?将事物封装在一个类中。

RAII实例(基本之一,东西可以被封装到类): http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

+0

“这是C++,这个类在哪里?把东西封装到一个类中。”如果使用正确的话,C++并没有说要把所有东西都塞进类中,命名空间和独立函数本身都很好。 – 2016-09-22 10:25:35

2

静态仅仅做两两件事:

  • 使一个变量为一个节目的整个生命存在(但这是全球性的水平,所以这里的任何东西都存在于整个程序生命中!)

  • 使变量仅在声明的翻译单元中可见(但这适用于任何一个匿名命名空间)。

所以,其实,在这个特定背景下静态什么都不做