头文件刷新/更新

时间:2015-08-25 14:43:09

标签: c++

我在使用头文件时遇到了一些麻烦。 我想"刷新"一个.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;

}

请考虑这是问题的极端近似值。 你们对如何解决它有什么想法吗? 提前谢谢。

编辑:

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

1 个答案:

答案 0 :(得分:2)

你不能这样做。出于各种原因,但并非最不重要的原因是因为您的变量是const,并且不会连续重新评估用于计算要分配给它们的值的表达式。

您想要的是使用functions

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变量关联的值,但是如果要重复计算具有不同值的表达式,最好的方法是将该表达式转换为 function ,如上所示,并调用具有不同参数的功能。

  3. 您可能需要将函数定义从标题移动到源文件,或将它们标记为inline,否则如果使用相同的定义,可能会警告(或接收错误)多个定义多个源文件中的标题。
  4. 要解决您的实际问题,如果您需要通过extern变量公开信息,则需要将它们设为非const ,并拥有main()功能初始化它们,或在静态初始化期间执行此操作。在执行此操作时需要注意许多问题,因此提供相应地计算几何的函数,并将这些计算基于一个或两个函数参数或少量extern变量更为安全。静态初始化为安全的东西,然后在信息可用后进行适当的设置。通过搜索例如,可以获得更多细节。 静态初始化外部变量

    在这种情况下,您可能希望考虑创建一个类来保存几何体并执行相关计算。可以将指向该类实例的指针创建为extern变量,并在程序初始化时(即静态地)初始化。然后,您可以将派生的“常量”作为成员函数提供,这些函数根据少量封装值计算结果,必要时可以设置/更新这些值。如果你小心的话,你甚至可以使它们const

    例如,请参阅下面的示例(live demo):

    // ******** 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;