用C ++链接文件

时间:2015-08-06 00:46:58

标签: c++ static-linking

我正在尝试通过基本的纸牌游戏计划,在休息2年之后梳理我的基本C ++技能。所以我创建了3个对象:deck,hand和card。一切都工作得很好,直到我试图为整个程序定义一个全局常量套牌并且所有东西都搞砸了(甲板应该是按顺序排列的所有52张牌并且永远不会改变)。我想弄清楚如何将以下文件链接在一起:

main.cpp
deck.h
deck.cpp
hand.h
hand.cpp
card.h
card.cpp

我需要在哪里包含,以及在何处以及如何定义我在整个计划中使用的全球套牌?我弄乱了现有的代码,试图将所有内容都包含在内,现在没有任何东西可以正确编译。谢谢!

3 个答案:

答案 0 :(得分:0)

对于套牌,只需在main.cpp中定义它。它可以通过引用传递给需要操作它的其他类中的任何函数。至于标头,#include只有当前源文件所需的标头。包括标题保护也是一个好主意,因此您不必担心引用标题的次数。

修改

另一个答案中提到了{p> extern。如果您实际定义了一个全局对象,那么这是必要的。关于全局变量的观点不一致。我在纯C ++中并没有经常看到它。

答案 1 :(得分:0)

要回答关于全局的问题,你可以在deck.h中将其声明为extern(我假设你的程序中有意义)并在deck.cpp中定义它。

例如:

加入deck.h

extern Card GLOBAL_DECK[52];

deck.cpp

Card GLOBAL_DECK[52];

现在至于使用全局,它是一种更好的方法来避免全局变量,并将引用传递给位于更高范围内的对象,或者在堆上创建对象并传递指针或引用它(但是你完成后必须记住删除它。)

关于你需要包含哪些内容的问题,你应该将每个标题包装在这样的包含警戒中(用标题文件名替换HEADER_NAME,例如hand.h变为HAND_H:

#ifndef HEADER_NAME
#define HEADER_NAME

header contents

#endif //Some people like to put HEADER_NAME here but it isn't really necessary 
//unless you are using a lot of precompiler directives, which you shouldn't be 

然后在需要它们的文件中包含标题。手和甲板需要卡,其他任何取决于你如何使用它们。由于您还没有提到您正在使用哪种编译器/工具集,因此无法向您提供具体说明。但我会自己编译它们并包含你需要的每个文件编译。您可能会遇到循环依赖,这意味着A需要B进行编译,这需要A进行编译(或者更长的链,但最终变成循环),并且您需要研究前向声明并且可能需要使用引用和指针来解决,或改变你的设计。

然后,您需要将目标文件链接在一起以生成可执行文件。如果您使用的是集成IDE,如Visual Studio或code :: blocks,它将为您完成,但您可能需要找出您的链接器是什么,或者如果您使用像eclipse这样的通用IDE,则需要设置一个。

答案 2 :(得分:0)

全局变量(或常量)声明在文件的顶部,在包含之下,但在任何代码之上。

所以对于这个例子,我会这样写:

#include <iostream>
#include <deck.h>
#include <hand.h>
#include <card.h>

extern deck ... // If we want to use the deck constant anywhere in our program

int main ()
{
    ...
}

注意我在这里假设甲板是非常数的(我认为这不会造成问题)。 但是如果您绝对需要使用全局常量,则可以创建一个新文件,例如将其命名为deckConstant.cpp,然后在此文件中写入以下内容:

namespace myGlobalConstant
{
    extern const deck ... // put the name of the constant you want
}

并创建文件deckConstant.h:

#ifndef DECKCONSTANT_H
#define DECKCONSTANT_H

namespace myGlobalConstant
{
    extern const deck ...
}
#endif

然后在main.cpp文件中添加:

#include <deckConstant.h>
using namespace myGlobalConstant

我希望我能正确理解这个问题。