【问题标题】:char variable has not been declaredchar 变量尚未声明
【发布时间】:2017-09-29 06:34:30
【问题描述】:

我昨天在尝试将代码拆分为多个文件时遇到了问题。

昨天早上我的整个代码都在一个文件中,为了更轻松地跟踪所有内容,我想将代码拆分为更多文件。

这很顺利,直到我得到一个需要声明变量的函数,尽管我已经有了(但可能在错误的地方)。

因为代码太长,我把所有文件都放到pastebin了。

我在 main.cpp 中声明了“字段”:

char field[20][41];

整个文件在这里:https://pastebin.com/Jy1XvdpL

我想在我的 field.cpp 中使用它:

void loadLevel(int levelnumber) {

// concatenate leven base with level number
std::string level = "level" + std::to_string(levelnumber) + ".txt";

// print field
// load the text file
std::ifstream file;
file.open(level);
char c;

// read line by line, character by character and store it in field
for (int i = 0; i < 20; i++) {
    for (int j = 0; j < 41; j++) {
        file.get(c);
        field[i][j] = c;
    }
}
file.close();

}

field.h 如下所示:

#ifndef field
#define field

#include <iostream>
#include <string>
#include <fstream>

void loadLevel(int levelnumber);
void drawField();

#endif // !field

问题是我不知道在哪里定义 char 字段,因为如果在这些文件中的任何一个中完成,我都会收到错误消息。那么我需要做什么才能让 char 字段在 field.cpp 中工作并因此在我的 main 中工作?

附:这是我的第一个 C++ 程序,我每天都在学习新东西。我很感激任何关于如何更好地做某些事情的提示^^

亲切的问候, 本杰明

【问题讨论】:

  • 首先,你没有在你的头文件中声明field变量,所以field.cpp源文件不会知道它(除非你有一个单独的声明)。但更大的问题是:你认为#define field 做了什么?也许你应该get a couple of good beginners books to read?特别是如果这是您的第一个 C++ 程序,您可能会做很多事情来有效地学习一些东西。开始很多更简单。
  • 对于未来的问题,请了解如何创建Minimal, Complete, and Verifiable Example。链接可能会过时,使问题变得毫无价值。
  • @Someprogrammerdude 我会考虑这些书。但是如果我在我的 field.cpp 中声明它,我的 main 不知道它,因为它说它没有被声明。如果我在两个文件中都声明它,就会有重复。
  • @Someprogrammerdude 这是我的第一篇文章,下次我会做得更好!感谢您对此的帮助:)
  • 如果你读过一本好书(或教程),它会告诉你声明(告诉编译器某处存在某事)和定义之间的区别i> (说“这东西在这里存在”)。您在某个源文件中定义变量,然后在需要该变量的源文件中包含的头文件中declare(使用extern 关键字)该变量.我还建议您了解translation units 的概念。

标签: c++ variables code-splitting


【解决方案1】:

当您在主文件中声明变量时,您无法在另一个文件中使用它。 (或者至少很容易)

如果你想在 field.cpp 中使用你的字段变量,那么你可以在 field.h 中定义它。

代码如下。

#ifndef 字段

#define field

#include <iostream>
#include <string>
#include <fstream>

void loadLevel(int levelnumber);
void drawField();

char field[20][41];

#endif // !field

虽然这将不允许您使用分配给 field[i][j] 的信息,但您的主文件中将不可用。

为此,我将在field.hfield.cpp 中创建一个返回field[i][j] 值的函数。

【讨论】:

  • 我做了其他事情。我把这是我的 field.h extern char field[20][41]; 这在我的 field.cpp 中:char field[20][41];
【解决方案2】:

您可以通过将字段数组作为参数传递给您的负载级别函数来在函数中使用字段数组,如果您想使用指针,请检查this 问题。 所以你的函数看起来像:

void loadLevel(int levelnumber,char field[][41]);

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-01-22
    • 2017-05-18
    • 2017-07-05
    • 2019-09-19
    相关资源
    最近更新 更多