1

我希望能够在 C/C++ 中执行以下操作(如果可能的话)。

我有一个像这样的文件:

Initialvariables.txt
a = 5
b = 2
c = 8

和看起来像这样的代码:

int main(int argc char *argv[])
{
int a;
int b;
int c;

LoadInitialVariables("Initialvariables.txt");
}

其中 a、b、c 是变量,文件“Initialvariables.txt”包含编译后可以更改的初始值。

是否可以创建 LoadInitialVariables,这样如果有新人来更改代码,他们可以简单地添加一个新的 int 并在“initialvariables.txt”中添加一个新行,然后代码将完成其余的设置来设置初始值多变的?

目的不是硬编码钩子,而是使 LoadInitialVariables 尽可能通用。

对我来说,困难似乎来自编译器去除符号的事实,因此如果没有适当的钩子,可执行文件将不知道 a、b、c 等是什么。如果可能的话,我宁愿不必指定钩子(除非它只是简单地装饰 int)。

4

4 回答 4

2

为什么不使用一个std::map<string, int>

如果不使用矢量或地图并稍后对其进行迭代,您的提议就没有多大意义。如果用户只是在 main 中添加了一个变量并添加了代码来解析并在您的加载函数中分配它......如果没有进一步的更改,现有代码将无法了解它。

于 2012-04-24T01:38:10.323 回答
2

您可以LoadInitialVariables()将文本文件加载到 a中,然后您可以在需要时按名称std::map<std::string, int>引用值,例如:int

void LoadInitialVariables(const std::string &fileName, std::map<std::string, int> &variables)
{
    variables.clear();

    char name[256];
    int value;

    for (each line in the file)
    {
        std::string line = ...;
        if (sscanf(line.c_str(), "%s = %d", name, &value) == 2)
            variables[name] = value;
    }
    ...
}

int main(int argc char *argv[])
{
    std::map<std::string, int> variables;
    LoadInitialVariables("Initialvariables.txt", variables);

    int a = variables["a"];
    int b = variables["b"];
    int c = variables["c"];
    ...
}
于 2012-04-24T01:40:11.840 回答
1

是否可以创建 LoadInitialVariables,这样如果有新人来更改代码,他们可以简单地添加一个新的 int 并在“initialvariables.txt”中添加一个新行,然后代码将完成其余的设置来设置初始值多变的?

不。

但是构建一个支持层并不难,程序员可以使用该支持层注册变量,然后文件解析器可以设置这些变量。std::map<std::string, int>最简单的方法是VBRonPaulFan 建议的 c++ 。在 c 中您必须编写更多代码,但仍然可以在几十行中完成(如果您只需要支持一种类型:几百行即可支持合理但固定的一组类型)。

于 2012-04-24T01:41:46.697 回答
0

你要求反思吗?它在 C++ 中不可用,至少不是开箱即用的。你总是可以做一些可怕的 C 风格的宏......

#define READ_FROM_FILE(X) X = some_function_that_greps_file_for(#X)

int a, b, c;
READ_FROM_FILE(a);
READ_FROM_FILE(b);
READ_FROM_FILE(c);

但是使用map<string, int>.

于 2012-04-24T01:50:40.197 回答