gpt4 book ai didi

c++ - 带有静态对象的奇怪输出

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:50 25 4
gpt4 key购买 nike

我不明白发生了什么......

假设我有以下代码:

// 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"; }
};

输出

Foo::Foo()

Foo::~Foo()

问题是:为什么输出中没有第二个“Foo::Foo()”?我认为它应该在这里,因为每个翻译单元(在我的例子中是 main.cpp 和 file.cpp)应该有自己的 Foo 对象(因为 static 关键字)。我错了吗?有人可以引用标准吗?

如果我像这样从函数中移动 Foo 对象的定义

// some_header.h

#include "foo.h"

static Foo instance;

inline
void foo()
{

}

输出将是

Foo::Foo()

Foo::Foo()

Foo::~Foo()

Foo::~Foo()

是内联魔术还是我错过了更基本的东西?

我需要做什么 - 我需要在我的仅 header 库的某些函数中添加 boost::mutex 对象,以同步某些 WinAPI 函数调用,如下所示:

inline
void some_func()
{
static boost::mutex sync;
boost::lock_guard<boost::mutex> lock(sync);
// Call some WinAPI function
}

我该怎么做?

MSVC-11.0.

最佳答案

static 是 C++ 中重载的关键字。在命名空间范围内,这意味着“实体具有内部链接,因此每个翻译单元都将拥有自己的拷贝”。在函数范围内,它意味着“函数只有一个这样的实体,并且它在函数调用中持续存在。”

因此在您的情况下,函数 foo() 仅具有一个对象 Foo instance,具有局部作用域,但具有全局生命周期。

至于你的互斥锁问题,我看不出你在问题中发布的内容有什么问题。 some_func() 将拥有互斥量的单个实例,所有对 some_fucn() 的调用都将共享该实例(自 C++11 起,它将是正确的并由第一个这样的调用线程安全地初始化)。我会说这正是您所需要的。

关于c++ - 带有静态对象的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com