说我正在为人口模拟食物:
Eat.cpp:
void eat()
{
food--:
}
Hunt.cpp:
void hunt()
{
food++;
}
eat()
和hunt()
都取决于整数food
。但是我的人口模拟器可能既包含这两个文件,又包含这两个文件,或者都不包含这两个文件。我如何确保food
仅在包含要使用的内容时存在,并且仅在有多个文件使用时才声明一次?目前,我最好的主意是某种标题保护,例如:
#ifndef FOOD
#define FOOD
int food = 10;
#endif
只需添加带有公共变量的food.cpp模块:
int food = 0;
还添加带有声明的头文件food.h:
extern int food;
并包括它:
#include "food.h"
在所有模块中(food.cpp,hunt.cpp和eat.cpp)。
这样,所有模块都将使用在专用模块中定义一次的相同变量。
顺便说一句,这是一种类似于C的设计方式,而不是C ++。
您可以将food
分配给任何函数管理和启动总体模拟的本地变量,从而可以完全控制eat
分配了多少次(例如,仅一次)。 hunt
和void 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将提醒您(或库用户),在这种情况下,您将无法声明它,从而无法分配它。
您可以在一个中央文件中定义变量extern
(即使该文件不使用它),然后在使用它的所有其他文件中将其声明为extern
。如果从未使用或引用过一个好的优化程序,它可能会优化掉该变量。不过,我从未测试过。
但是,如果需要初始化,则可能无法使用。如果需要初始化,则可能需要确保变量仅初始化一次。此初始化将仅必须在一个文件中完成,并且可能会阻止变量被优化,因为使用了变量(即使仅用于初始化)。
因此,如您在问题中所述,使用预处理器进行条件编译可能是最佳选择。