首先我要说的是,我已经在google上广泛搜索了答案,更具体地说是在这里。
事实上我(至少我认为我做过)找到了有类似问题的人,虽然给他们的答案给了我另一个问题。
我正在使用Visual Studio 2010 Express并使用SFML库(尽管我不认为这最后一部分是相关的)
所以这就是:
我有一个名为player.cpp的源文件,它包含类Player,我有一个名为cc.h(命令和控制)的头文件(包含在所有源文件中),它包含所有必需的包含和外部变量/函数。基本代码可以总结如下:
Player.cpp:
#include "cc.h"
class Player
{
private:
//some variables here
public:
//more variables and some functions
}john;//example instance
cc.h:
#pragma once
//some #includes
//some externs
extern Player john;
现在在cc.h中,单词Player被强调为错误,表示它是未定义的标识符,但有时只是有时候,visual studio不会将其标记为错误,而是识别它作为一个类,但不承认john是同一个类的对象/实例(我希望它是这样称呼的)。
此外,在编译第一个错误时,它在john的extern声明的行中显示为“error C2146: syntax error : missing ';' before identifier 'john'
”,在cc.h中,显然(对我来说)没有任何意义。
答案 0 :(得分:6)
cc.h中的全局声明对我没有帮助,我猜 - 因为你声明它从其他地方(除了Player.cpp之外)访问它,但为此你需要方法签名 - 你想要的很快要从其他地方访问john
并因此包含Player.cpp,您将获得重复的符号。
请考虑创建一个Player.h
文件,其中只声明类和方法签名 - 如下所示:
#ifndef PLAYER_H_
#define PLAYER_H_
class Player
{
void doSomething();
};
#endif
并将其添加到cc.h:
#include <Player.h>
extern Player john;
并在你的Player.cpp中
#include <Player.h>
Player john;
void Player::doSomething()
{
//...
}
这可确保Player
签名已知并且全局声明有效实例。
答案 1 :(得分:3)
在声明Player
变量之前,您需要将extern
类的定义放在头文件中。否则,编译器不知道Player
是什么。
我建议这样的事情:
<强> player.h 强>
#ifndef PLAYER_H_
#define PLAYER_H_
class Player {
...
};
#endif
<强> player.cpp 强>
#include "player.h"
Player john;
<强> cc.h 强>
#ifndef CC_H_
#define CC_H_
#include "player.h"
extern Player john;
#endif
答案 2 :(得分:0)
Player
类
extern
来使用具有外部链接的变量,并且已在其他文件中定义。例如:您有文件a.cpp
,并且此文件中包含全局变量Player p
。如果您想在文件p
中使用Player
的完全相同的c.cpp
实例,那么请在文件c.cpp
内编写extern Player p
。
我希望自己清楚明白。
答案 3 :(得分:0)
“ extern Player john;” 被认为是未定义的标识符,因为编译器无法理解 Player 是什么,因为您没有包含文件 Player.cpp ,其中将Player类声明为 cc.h 。 始终建议在头文件中声明该类及其方法,例如在Player.h中声明,然后在源文件(即Player.cpp)中定义这些方法。 并将player.h包含在您的cc.h中,以便编译器了解“ Player john;” 的声明位置。