c++中的外部链接

External Linkage in c++

本文关键字:链接 外部 c++      更新时间:2023-10-16

我正在制作一个简单的程序来处理扑克手牌和概率。我在不同的手上运行测试用例,在我的程序中,我需要一个牌组来绘制我的手牌,它是恒定的和全局的。我的程序有三个主要对象:Card, Hand和Deck。我试图创建一个全局甲板,但似乎无论我做什么,我得到一个错误说globalDeck是未定义的手。cpp。以下是相关代码:

hand.cpp:

Hand::Hand(int &one, int &two, int &three, int &four, int &five)
{
    cardsinHand.push_back(globalDeck.copy(one));
    cardsinHand.push_back(globalDeck.copy(two));
    cardsinHand.push_back(globalDeck.copy(three));
    cardsinHand.push_back(globalDeck.copy(four));
    cardsinHand.push_back(globalDeck.copy(five));
}

和我的cardgames.cpp文件:

#include "stdafx.h"
#include<iostream>
#include "hand.h"
using namespace std;
Deck globalDeck;
void printresults(long successes, long trials)
......

注意:我已经尝试用外部甲板globalDeck,外部const globalDeck等代替甲板globalDeck。似乎没有什么可以使globalDeck在hand.cpp中定义。此外,deck在整个程序中保持不变,因此可以将其声明为全局常数或全局变量,以更容易的方式声明。我的错误输出是:

1>c:users\desktopsemesters pastwinter 2013computer programmingprojectscardgamescardgameshand.cpp(31): error C2065: 'globalDeck' : undeclared identifier
1>c:users\desktopsemesters pastwinter 2013computer programmingprojectscardgamescardgameshand.cpp(31): error C2228: left of '.copy' must have class/struct/union
1>          type is 'unknown-type'

在一个头文件中声明全局变量

extern Deck globalDeck;

在cardgames.cpp

中定义
Deck globalDeck;

解释:编译器必须先看到globalDeck是什么,然后才能使用它。编译器主要是单独处理每个*.cpp,而不查看其他的。在头文件中,您可以说明程序中的内容,而无需给出完整和唯一的定义。

全局变量globalDeck需要在使用它的每个编译单元(.cpp文件)中声明。需要在一个编译单元中定义

形式的声明

Deck globalDeck;

既是声明又是定义。带有extern的声明:

extern Deck globalDeck;

只是声明,不是定义。

头文件(.h文件)只是包含在#include的其他文件中的文本。因此,您可以将声明extern Decl globalDeck;放在头文件中(任何头文件),并将该头文件中的#include放在每个.cpp文件中。您还需要在一个.cpp文件中定义该定义。

class Deck没有在hand.cpp中定义,因为缺少标头。您需要添加#include "hand.h"#include "deck.h"