在运行时更改变量而不使用C / C ++中的钩子?

时间:2012-04-24 01:29:39

标签: c++ c hook

我希望能够在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,如果a新人来改变代码,他们可以简单地添加一个新的int并在“initialvariables.txt”中添加一个新行,代码将完成其余的工作以设置初始变量?

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

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

4 个答案:

答案 0 :(得分:2)

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

如果不使用矢量或地图并在以后迭代它,那么你提出的建议并没有多大意义。如果用户只是在main中添加了一个变量并添加了代码来解析并在你的加载函数中分配它...现有的代码在没有进一步更改的情况下就无法知道它。

答案 1 :(得分:2)

您可以LoadInitialVariables()将文本文件加载到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"];
    ...
}

答案 2 :(得分:1)

  

是否可以创建LoadInitialVariables,这样如果有新人来改变代码,他们可以简单地添加一个新的int并添加一个新行到&#34; initialvariables.txt&#34;并且代码将完成剩下的工作以设置初始变量?

没有

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

答案 3 :(得分:0)

您要求reflection吗?它在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>会更容易,更安全,更易于维护。