头文件刷新/更新

Header file refresh/update

本文关键字:更新 刷新 文件      更新时间:2023-10-16

我在使用头文件时有一些麻烦。我想"刷新"一个。h文件,以便更新其中依赖于外部变量(在主。cc文件中定义)的常量的所有值。大致情况如下:

头文件(Header .h)

extern int extern_value;
const int one = value;
const int two = value * 2;
const int three = value * 3;

主程序

#include "header.h"
int extern_value;
int main(){
extern_value = 10;
// Here is where I would like to refresh the header file.
// Here is where I would like to have my dependant constants
// (one, two and three) being updated.
return 0;
}

请考虑这是问题的极端近似。你们知道怎么解吗?提前谢谢。

编辑:

这是我的实际问题:我想有一个头文件,其中包含所有的图形常量,我的项目需要。它们都取决于显示器的大小。主程序做的第一件事是获取有关显示尺寸的信息;然后,我希望程序在头文件中"导出"这些信息,这样它就可以计算相对于显示大小的所有图形常量。

你不能这么做。由于各种原因,但最重要的原因是您的变量是const,并且您用于计算要分配给它们的值的表达式不会不断地重新求值。

你想要的是使用函数:
extern int extern_value;
int one() { return extern_value; }
int two() { return extern_value * 2; }
int three() { return extern_value * 3; }

其他笔记:

  1. 您可能不应该为此使用extern变量。将value传递给函数:

    int one(const int value) { return value; }
    int two(const int value) { return 2 * value; }
    int three(const int value) { return 3 * value; }
    int main() {
        int value = 10;
        std::cout << one(value) << " " << two(value) << "n";
        return 0;
    }
    
  2. 你不能"刷新"头文件。文件的内容是您键入的内容,当您使用#include "my_header.h"时,它包含(实际上是粘贴到)源文件中。您可以更新与非const变量相关的值,但是如果您想用不同的值重复计算表达式,最好的方法是将该表达式转换为上面所示的函数,并使用不同的参数调用函数。

  3. 你可能需要将函数定义从头文件移动到源文件,或者将它们标记为inline,否则如果你在多个源文件中使用相同的头文件,你可能会被警告(或收到错误)多个定义。

为了解决您的实际问题,如果您需要通过extern变量公开信息,您需要使它们非const,并让main()函数初始化它们,或者在静态初始化期间这样做。这样做时需要注意许多问题,因此提供相应计算几何的函数要安全得多,并将这些计算基于一个或两个函数参数,或静态初始化为安全的少量extern变量,然后在信息可用时进行适当设置。进一步的细节可以通过搜索例如静态初始化外部变量来获得。在这种情况下,您可能希望考虑创建一个类来保存您的几何图形并执行相关计算。指向该类实例的指针可以作为extern变量创建,并在程序初始化时初始化(即静态)。然后,您可以将派生的"常量"作为成员函数提供,该成员函数根据少量封装值计算结果,这些值可以在必要时进行设置/更新。如果你小心的话,你甚至可以让这些都是const

请看,例如下面的例子(实时演示):

// ******** HEADER FILE ********
class Geometry {
  public:
    Geometry(const int rows, const int cols)
     : rows_(rows), cols_(cols) {}
    int rows() const { return rows_; }
    int cols() const { return cols_; }
    int pixels() const { return rows_ * cols_; }
    // whatever other "constants" you need, defined as functions
    // containing expressions based on rows_ and cols_.
  private:
    // Make copy constructor & assignment operator private to prevent copying
    Geometry(const Geometry&);
    Geometry& operator=(const Geometry&);
    // The data from which everything else is calculated
    const int rows_;
    const int cols_;
};
extern const Geometry* the_geometry;
// ******** SOURCE FILE ********
#include <iostream>
int main() {
    const int rows = 80; // or however you get the number of rows
    const int columns = 25; // or however you get the number of columns
    the_geometry = new Geometry(rows, columns);
    std::cout << the_geometry->pixels() << "n"; 
    return 0;
}
const Geometry* the_geometry = nullptr;