字段声明在此范围内未声明的void / struct或变量

时间:2012-08-10 18:51:36

标签: c++

我一直在教自己一些使用SFML创建窗口/处理输入的OpenGL等等。我的main.cpp开始变得有些笨拙,所以我决定开始拆分我的代码。我创建了一个4X_vertex.h和一个4X_vertex.cpp(4X是项目的名称)并将相关的函数和结构移出我的main并进入这些文件。但是,当我编译时,我收到错误

variable or field "drawVertexArray" declared void

我的研究似乎只是一个与下一个错误有关的无用信息,即

vertex was not declared in this scope

以下是我的main.cpp

中的包含列表
#include <iostream>
#include <fstream>
#include <string>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "4x_vertex.h"
#include "4x_constants.h"

我的4X_vertex.h

#ifndef _4X_VERT_H
#define _4X_VERT_H
struct vertex{
        GLfloat x,y,z;
        GLfloat r,g,b;
};
void drawVertexArray(vertex v[]);
vertex* loadVertexData();
#include "4X_vertex.cpp"
#endif

4X_vertex.cpp给我带来麻烦的部分:

using namespace std;

void drawVertexArray(vertex v[]){
    ... openGL stuff...
}

所有这一切都在我开始移动它之前有效,所以我假设有一些奇怪的东西,包括,或者什么。非常感谢所有帮助!

2 个答案:

答案 0 :(得分:1)

只是一些指示。最佳做法是将项目划分为多个源文件。通常,您可以在主源文件的文件名中使用“main”一词(如果适用)。所以你可能会有类似......

main.cpp
feature1.cpp
feature2.cpp
tools.cpp

对于您的其他文件,您通常会在它们实现的类之后命名它们。您通常会同时拥有.h和.cpp。将您的声明放在.h中,而.cpp中的定义包含.cpp .h。那可能会给你......

main.cpp
feature1.cpp    feature1.h
feature2.cpp    feature2.h
tools.cpp       tools.h

引用其中一个类的模块也包括它.h。所以,main.cpp可能看起来像......

#include <iostream>
#include "feature1.h"
#include "feature2.h"

using namespace std;
void main(int argc, char **argv)
{ ...
    cout << "Done!\n";
}

并且feature1.cpp可能是......

#include "feature1.h"
#include "tools.h"
feature1_class::feature1_class() { ... }
void feature1_class::AUsefulFeature(int val) { ... }
//etc.

...其中feature1.h声明了类,定义了常量等等,例如,

#ifndef FEATURE1
#define FEATURE1
#include "tools.h"
class feature1_class
{
public:
    feature1_class();
    void AUsefulFeature(int val);
    int APublicMember;
};
#endif

你可能已经注意到tools.h实际上在feature1.cpp中包含了两次。它包含在feature1.h中,并明确地来自.cpp文件。如果在.h文件中使用以下模式...

#ifndef TOOLS_H
#define TOOLS_H
//... do your thing
#endif

...然后多个包含不应该导致任何问题。当您重构代码时,不必担心清理代码。

如果您到目前为止所有来源都使用过单个文件,那么您可能一直在编译......

cl main.cpp

它为您提供.exe和.obj以及其他文件。但是涉及多个源文件,它并没有太大的不同。你可以说......

cl main.cpp feature1.cpp feature2.cpp tools.cpp

还有很多东西值得学习,但这是一个开始,可以帮助您更好地组织编码思想。

答案 1 :(得分:0)

您需要#include "4X_vertex.h"文件顶部的4X_vertex.cpp。这将允许.cpp文件查看struct vertex的声明。

通常,每个文件(.h和.cpp文件)都需要#include任何包含该文件中使用的项目声明的头文件。这包括标准标题和OpenGL标题,以及您的自定义标题。