我很困惑如何在不使用全局变量的情况下跨多个文件定义和声明我的变量和函数。 假设我想要在'main.cpp'之外使用单独的头文件和源文件来声明和定义变量和函数,以便在'main.cpp'中使用。
编辑:为我不清楚的例子道歉,但只会有一个气球。我不希望气球成为一个物体。它只是保留一些变量和函数。//balloon.h
bool inflated = true;
void pop();
-
//balloon.cpp
#include "balloon.h"
void pop()
{
inflated = false;
}
-
//main.cpp
#include "balloon.h"
int main()
{
pop();
return 0;
}
如果我这样做,它会给我带来错误的'膨胀'的多个定义,并且它首先在'balloon.cpp'中声明。
如果我使用'extern',它会起作用,但会给我警告有关在'balloon.h'中初始化和声明'膨胀'的信息。
如果我决定不在balloon.h中定义膨胀,它会给我一个关于'膨胀'的未定义引用的错误。
解决这个问题的标准方法是什么?我是否遗漏了多个文件中变量/函数声明/定义的一些关键信息?
答案 0 :(得分:1)
直接它应该是
//balloon.h
extern bool inflated;
void pop();
//balloon.cpp
#include "balloon.h"
bool inflated = true;
void pop() {
inflated = false;
}
答案 1 :(得分:0)
没有“标准”的方式,但显然你的目标就是一个带有操作的逻辑对象:一些对一些常见共享变量进行操作的函数。
这是例如原始的模块概念。 C和Modula-2。
在C中,在实现文件中将变量声明为static
,以便不将其名称暴露给链接器。这称为内部联系。在C ++中,不推荐使用static
,而应优先使用匿名命名空间:
balloon.h 的
#pragma once
auto is_inflated() -> bool;
void inflate();
balloon.cpp 的
#include "ballon.h"
namespace {
bool inflated = true;
} // namespace anon
auto is_inflated() -> bool { return ::inflated; }
void inflate() { ::inflated = true; }
但是,不要使用这个老式的模块作为逻辑变量,而是考虑定义一个类。
这就是的类。
免责声明:代码未触及编译器的手。
答案 2 :(得分:0)
如果您不想使用全局变量,则创建类以执行OOP样式。
class A
{
public:
bool inflated = true;
void pop();
}
你可以像你所做的那样分离规范和实现,它看起来像这样:
void A::pop()
{
bool inflated = false;
}
然后在main中包含.h文件并创建一个类的对象:A* a = new A();
如需更多参考,请访问http://www.cplusplus.com/doc/tutorial/classes/