我无法理解发生了什么......
假设我有以下代码:
// main.cpp
#include "some_header.h"
void bar();
int main()
{
foo();
bar();
}
// file.cpp
#include "some_header.h"
void bar()
{
foo();
}
// some_header.h
#include "foo.h"
inline
void foo()
{
static Foo instance;
}
// foo.h
#include <iostream>
class Foo
{
public:
Foo() { std::cout << "Foo::Foo() \n"; }
~Foo() { std::cout << "Foo::~Foo() \n"; }
};
Run Code Online (Sandbox Code Playgroud)
产量
富::富()
富::〜富()
问题是:为什么输出中没有第二个"Foo :: Foo()"?我认为它应该在这里因为每个翻译单元(在我的情况下是main.cpp和file.cpp)应该有自己的Foo对象(因为静态关键字).我错了吗?有人可以引用这个标准吗?
如果我从这样的函数移动Foo对象的定义
// some_header.h
#include "foo.h"
static Foo instance;
inline
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
输出将是
富::富()
富::富()
富::〜富()
富::〜富()
它是内联魔法还是我错过了更基本的smth?
我需要做什么 - 我需要在我的仅头文件库的某个函数中添加boost :: mutex对象来同步一些WinAPI函数调用,如下所示:
inline
void some_func()
{
static boost::mutex sync;
boost::lock_guard<boost::mutex> lock(sync);
// Call some WinAPI function
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
MSVC-11.0.
static是C++中重载的关键字.在命名空间范围内,它意味着"实体具有内部链接,因此每个翻译单元都有自己的副本".在函数范围,它意味着"函数只有一个这样的实体,并且它在函数调用中持续存在."
因此,在您的情况下,foo()函数只有一个Foo instance具有局部范围但具有全局生命周期的对象.
至于你的互斥问题,我看不出你在问题中发布的内容有什么不妥.some_func()将有一个互斥锁的实例,并且所有调用some_fucn()将共享该一个实例(并且从C++ 11开始,它将被第一次这样的调用正确且线程安全地初始化).我会说这正是你所需要的.