【问题标题】:Changing variables during run-time without the use of hooks in C/C++?在运行时更改变量而不使用 C/C++ 中的钩子?
【发布时间】:2012-04-24 09:50:40
【问题描述】:

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

我有一个这样的文件:

初始变量.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 尽可能通用。

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

【问题讨论】:

  • 如果你可以让你的文件只是数字,那么很容易将它们读入并将它们存储到一个向量中并返回它。没有数字,同样的原则也适用,但你必须绕过文件中的其他文本。

标签: c++ c hook


【解决方案1】:

您可以让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】:

    为什么不使用std::map&lt;string, int&gt;

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

    【讨论】:

      【解决方案3】:

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

      没有。

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

      【讨论】:

        【解决方案4】:

        你要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&lt;string, int&gt; 更容易、更安全且可维护。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-12
          • 2011-11-26
          • 2015-08-17
          • 1970-01-01
          相关资源
          最近更新 更多