0

我正在处理一项任务,我们将一个工作项目(包含在一个 cpp 文件中)并将其拆分为几个模块/cpp 文件。这是我第一次使用头文件,我有点不确定该怎么做。我知道头文件用于声明结构和变量等,但仅此而已。我经常遇到的一个错误是“...未在此范围内声明。我的代码中的一个示例;

在“cookie.h”中,我有以下代码;

#ifndef _cookie_H_INCLUDED_
#define _cookie_H_INCLUDED_

struct Cookie {


int initialNumberOfRows;

/// Number of rows currently remaining in the cookie
int numberOfRows;

/// Number of columns currently remaining in the cookie
int numberOfColumns;


/**
 * The "shape" of the cookie.
 *
 * If crumbs[i] == j, then the cookie currently
 * has crumbs filling the j columns at row i
 */
int* crumbs;
};

但是,当我尝试运行该程序时,我收到错误“cookie 未在此范围内声明”,特别是源自另一个头文件“computerPlayer.h”该部分的代码如下:

#ifndef _computerPlayer_H_INCLUDED_
#define _computerPlayer_H_INCLUDED_
bool isADangerousMove (Cookie& cookie, int column, int row);
#endif // _game_player_INCLUDED_

我不确定如何将头文件“链接”在一起,如果这是正确的思考方式?

4

1 回答 1

1

computerPlayer.h从编译器的角度来看:

#ifndef _computerPlayer_H_INCLUDED_
#define _computerPlayer_H_INCLUDED_
bool isADangerousMove (Cookie& cookie, int column, int row);
#endif // _game_player_INCLUDED_

编译器试图编译#includes 的东西,所以我们可以想象它被插入到源文件的顶部附近。的声明isADangerousMove引用了Cookie,但是编译器从来没有听说过Cookie,所以它拒绝编译这个东西。

你可以#include "cookie.h"在顶部computerPlayer.h,但那将是矫枉过正。相反,只需使用前向声明

#ifndef _computerPlayer_H_INCLUDED_
#define _computerPlayer_H_INCLUDED_
struct Cookie;
bool isADangerousMove (Cookie& cookie, int column, int row);
#endif // _game_player_INCLUDED_

这告诉编译器有一个名为Cookie. 什么是Cookie?目前,没关系。对于编译器来说,这是足够的信息来编译代码——其中可能包括对代码的调用isADangerousMove——并生成一个目标文件(比如computerPlayer.o)。稍后,当链接器尝试将这些目标文件链接在一起时,它会查找此结构的定义(位于 中cookie.h),如果找不到,您将收到链接器错误。

于 2013-09-16T19:12:24.090 回答