我有一个inline
函数,该函数在标头中定义了函数本地静态,如下所示:
singleton.hpp
inline int& instance(){
static int v;
return v;
}
我将header.hpp
包含在两个独立的共享对象A.so
和B.so
中。
A.so
:
#include "singleton.hpp"
namespace A{
void set(int v){
instance() = v;
}
int get(){
return instance();
}
}
B.so
:
#include "singleton.hpp"
namespace B{
void set(int v){
instance() = v;
}
int get(){
return instance();
}
}
main.cpp
#include "a.hpp"
#include "b.hpp"
#include <iostream>
int main(void){
A::set(42);
std::cout << B::get() << std::endl;
B::set(13);
std::cout << A::get() << std::endl;
}
我同时将A.so
和B.so
链接到我的可执行文件main
。
问题:A.so
和B.so
是否看到相同的函数局部静态对象?
换句话说,如果像v
那样从A.so
修改instance() = 42
,从B.so
可以看到吗?
我实际上尝试过,并且确实确实有效。但是,我不确定这是特定于实现还是未定义的行为。有关完整示例,请参见https://github.com/jrhemstad/link_test。
答案 0 :(得分:0)
c ++中内联的含义不同于C中的内联。请参见inline in c++
从c ++ 17开始,规范就为内联函数定义了
所有函数定义中的局部函数静态对象在所有翻译单元之间共享(它们均引用一个翻译单元中定义的同一对象)
对于纯“内联”,它可以工作,但对于“静态内联”,至少g ++仍会创建静态对象的多个副本。