C++中类似Python的静态数据存储

Python-like storage of static data in C++?

本文关键字:静态 数据 存储 Python C++      更新时间:2023-10-16

当我有测试数据对象或其他静态数据对象(如SQL字符串)时,我喜欢将它们排除在应用程序代码之外。在Python中,这是通过一个单独的源文件和一个导入来完成的,如下所示。C++是如何组织和使用静态数据的?

 (file: testdata.py)
x = Foo() (an object)
x.name = "Bar"
x.number = 123
..
(file: test.py)
import testdata.py
testObject1 = testdata.x 
..

有很多可能性。这也取决于您试图做什么(例如,您希望值在编译后是可编辑的,还是仅在编译前可编辑?

至于后面的,你可以使用一个单独的翻译单元。

在某些头文件中:

extern const char *name;
extern const int number;

在一个单独的源文件中:

const char *name = "Bar";
const int number = 123;

然而,您也可以使用类/结构方法:

头文件:

struct Foo {
    const char *name;
    int number;
};
extern const Foo Bar;

源文件:

const Foo Bar = {"Bar", 123};

对于连接字符串等,最灵活的选择是创建一个设置文件(使用您自己选择的格式)和一个可以读取文件的类,因为这允许您在不重新编译程序的情况下更改设置。

对于要包含在代码中的静态数据,可以使用静态类成员:

// file.h
class Foo {
public:
    static string getBar();
private:
    static string bar;
};
// file.cpp
Foo::bar = "qwe";
static Foo::getBar() {
    return bar;
}

您也可以将它们放在另一个文件中;头文件中的extern数据声明,以及.cpp文件中的定义,如下所示:

// Foo.h
extern Foo afoo;
extern int anint;
// Foo.cpp
Foo afoo;
int anint = 0;

然后,您可以在任何需要使用afooanint的地方使用#include "Foo.h"

有很多方法可以从源代码中存储数据。

例如,配置文件存储在XML中,尽管(幸运的是)JSON已经获得了一些基础(没有我想要的那么多),而且还有自定义格式。

另一个例子是,对于翻译,您可以使用gettext并将字符串存储在.po文件中,并在不重新编译的情况下添加新语言。

最终,一切都以相同的方式进行:

  • 定义文件的格式
  • 您创建了一个读取器(也许还有编写器)过程,用于在文件格式和内存格式之间进行转换
  • 您可以找到一种将文件路径传递给程序的方法:当前目录中的固定名称、主目录中的定名、命令行参数、环境变量等

如果你想像在Python中那样做,你也可以将资源编译到它们自己的DLL中,并在加载符号时在运行时提取它们,更改资源只需要重新编译这一个DLL。