根据需要声明资源而不重复资源

问题描述 投票:-1回答:3

说我正在为人口模拟食物:

Eat.cpp:

void eat()
{
    food--:
}

Hunt.cpp:

void hunt()
{
    food++;
}

eat()hunt()都取决于整数food。但是我的人口模拟器可能既包含这两个文件,又包含这两个文件,或者都不包含这两个文件。我如何确保food仅在包含要使用的内容时存在,并且仅在有多个文件使用时才声明一次?目前,我最好的主意是某种标题保护,例如:

#ifndef FOOD
#define FOOD
int food = 10;
#endif
c++
3个回答
0
投票

只需添加带有公共变量的food.cpp模块:

int food = 0;

还添加带有声明的头文件food.h:

extern int food;

并包括它:

#include "food.h"

在所有模块中(food.cpp,hunt.cpp和eat.cpp)。

这样,所有模块都将使用在专用模块中定义一次的相同变量。

顺便说一句,这是一种类似于C的设计方式,而不是C ++。


0
投票

您可以将food分配给任何函数管理和启动总体模拟的本地变量,从而可以完全控制eat分配了多少次(例如,仅一次)。 huntvoid eat(int & food) { food--; } 然后应使用此(唯一)食物实例进行参数化:

Eat.cpp:

void hunt(int & food) { food++; }

Hunt.cpp:

food

这里是一个示例模拟,其中保证只有Hunt.cpp的一个实例存在,并且从未触及过#include "Eat.h" void no_hunt_simulation(int & food) { while (food) { eat(food); } }

no_hunt_simulation.cpp:

#include "no_hunt_simulation.h"

int main() {
  int food = 5;
  no_hunt_simulation(food);
  std::cout << "Remaining food: " << food << std::endl; //it's 0
}

main.cpp

-Wall

使用food,如果未使用food,GCC将提醒您(或库用户),在这种情况下,您将无法声明它,从而无法分配它。


0
投票

您可以在一个中央文件中定义变量extern(即使该文件不使用它),然后在使用它的所有其他文件中将其声明为extern。如果从未使用或引用过一个好的优化程序,它可能会优化掉该变量。不过,我从未测试过。

但是,如果需要初始化,则可能无法使用。如果需要初始化,则可能需要确保变量仅初始化一次。此初始化将仅必须在一个文件中完成,并且可能会阻止变量被优化,因为使用了变量(即使仅用于初始化)。

因此,如您在问题中所述,使用预处理器进行条件编译可能是最佳选择。

© www.soinside.com 2019 - 2024. All rights reserved.