C++ 中的外部链接
External Linkage in c++
我正在制作一个处理扑克手牌和概率的简单程序。我是 运行 不同手的测试用例,在我的程序中,我需要一副套牌来绘制我的手,它是恒定的和全局的。我的程序包含三个主要对象:Card、Hand 和 Deck。我正在尝试创建一个全局甲板,但似乎无论我做什么,我都会收到一条错误消息,提示 globalDeck 在 hand.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)
......
注意:我已经尝试用 extern Deck globalDeck、extern const globalDeck 等替换 Deck globalDeck。似乎没有什么可以使 globalDeck 在 hand.cpp 中定义。此外,牌组在整个程序中将保持不变,因此可以将其声明为全局常量或全局变量,以更容易的为准。我的错误输出是:
1>c:\users\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.cpp(31): error C2065: 'globalDeck' : undeclared identifier
1>c:\users\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.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,而不查看其他文件。在头文件中你可以说出程序中有什么东西而无需给出完整和唯一的定义。
class Deck
尚未在 hand.cpp
中定义,因为缺少 header。您需要添加类似 #include "hand.h"
或 #include "deck.h"
.
的内容
全局变量globalDeck
需要在每个使用它的编译单元(.cpp文件)中声明。它需要在正好一个编译单元中定义。
形式的声明
Deck globalDeck;
既是声明又是定义。带有 extern
的声明,例如:
extern Deck globalDeck;
只是一个声明,不是一个定义。
头文件(.h 文件)只是包含在带有 #include
的其他文件中的文本。因此,您可以将声明 extern Decl globalDeck;
放在头文件(任何头文件)中,并将该头文件 #include
放在每个 .cpp 文件中。您还需要一个 .cpp 文件中的定义。
我正在制作一个处理扑克手牌和概率的简单程序。我是 运行 不同手的测试用例,在我的程序中,我需要一副套牌来绘制我的手,它是恒定的和全局的。我的程序包含三个主要对象:Card、Hand 和 Deck。我正在尝试创建一个全局甲板,但似乎无论我做什么,我都会收到一条错误消息,提示 globalDeck 在 hand.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)
......
注意:我已经尝试用 extern Deck globalDeck、extern const globalDeck 等替换 Deck globalDeck。似乎没有什么可以使 globalDeck 在 hand.cpp 中定义。此外,牌组在整个程序中将保持不变,因此可以将其声明为全局常量或全局变量,以更容易的为准。我的错误输出是:
1>c:\users\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.cpp(31): error C2065: 'globalDeck' : undeclared identifier
1>c:\users\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.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,而不查看其他文件。在头文件中你可以说出程序中有什么东西而无需给出完整和唯一的定义。
class Deck
尚未在 hand.cpp
中定义,因为缺少 header。您需要添加类似 #include "hand.h"
或 #include "deck.h"
.
全局变量globalDeck
需要在每个使用它的编译单元(.cpp文件)中声明。它需要在正好一个编译单元中定义。
形式的声明
Deck globalDeck;
既是声明又是定义。带有 extern
的声明,例如:
extern Deck globalDeck;
只是一个声明,不是一个定义。
头文件(.h 文件)只是包含在带有 #include
的其他文件中的文本。因此,您可以将声明 extern Decl globalDeck;
放在头文件(任何头文件)中,并将该头文件 #include
放在每个 .cpp 文件中。您还需要一个 .cpp 文件中的定义。