仅限标头库中的静态数据

Set*_*gie 14 c++ static libraries header-only

我正在开发一个只包含头文件的库.到目前为止,它只包含类,这很好.但是,我已经到了这样的程度,我需要在库中有一些库中可访问的不可变数据(即,不是类实例数据)来实现某些功能.你显然不能只将全局数据放在头文件中,否则每个标题的编译单元#include都会有一个符号定义,你会在链接时得到多个定义错误.

我似乎找到了一个解决方法,让我可以在类中拥有静态数据,而无需通过将数据static作为函数中的变量并返回指向该数据的指针来向库中添加编译单元:

class StaticData {
public:
    void doSomething() { /* this uses getData */ }
    void doSomethingElse() { /* this does too */ }

private:
    static int* getData() {
        static int array[] { 1, 2, 3, 4 };

        return array;
    }
};
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但我必须承认我不知道头文件static中的inline函数中的函数数据会发生什么.我想知道这个"黑客"是否有任何意想不到的影响,比如#include这个标题的每个编译单元都有自己的版本array.编译器如何以及在何处决定使用它?

还应该注意的是,我没有使用它来实现单例反模式或任何东西.我只是用它来存储多个函数需要使用的数据(这就是为什么它不能static只是一个使用它的函数,但即使它确实如此,也会提示相同的问题).

Mik*_*our 9

没关系.array只要函数具有外部链接,就可以保证只有一个副本.C++标准说:

7.1.2/4 extern内联函数中的静态局部变量始终引用同一个对象.