所以,我是一名正在尝试学习C ++的Java开发人员。 C ++的多文件结构对我来说很奇怪,是一个java开发人员,被类破坏了。
我正在尝试创建一个.cpp文件,可以加载其他.cpp文件,类似于Java classese加载其他类。我理解它的方式是,我有3个文件:main.cpp,filetobeloaded.h和filetobeloaded.cpp都在同一目录中。 main.cpp将有一个
#include <filetobeloaded.h>
然后filetobeloaded.h将有
#ifndef LOOP_H
#define LOOP_H
void loop_start();
void loop_run();
void loop_init();
#endif /* LOOP_H */
而filetobeloaded.cpp将有
void loop_init(){
//load libraries here
}
void loop_start(){
//this loop runs as long as the user doesn't request the program to close.
//In that case, this function will return and the program will exit.
}
void loop_run(){
//render stuff here, call subroutines
}
显然我做错了,因为我的编译器告诉我那行
#include <filetobeloaded.h>
无效,因为该文件不存在。我已经检查过filetobeloaded.h和filetobeloaded.cpp都和main.cpp在同一个目录中。我不知道它为什么搞乱了。
问题:
1:为什么我有错误,我该如何解决?
2:有没有比我正在做的更好的方法将我的源代码分成不同的文件?
3:你能用java开发人员能理解的方式解释C ++多文件结构吗?
我正在尝试使用OGL在C ++中制作游戏。我正在学习c ++ vs java因为速度快,内存泄漏少(我希望)和Steam集成。
我没有一本关于c ++的好书,我在互联网上搜索过...每个人似乎都有不同的做法,这对我来说很困惑......
提前致谢!
答案 0 :(得分:8)
在include目录中进行#include <...>
次搜索(特定于编译器,通常为/usr/include
,其他一些用于Linux,或Windows上的编译器安装目录),而{{1}搜索当前目录。确保使用正确的。
不,你做对了。
在C ++中,有声明 1 和定义 2 。声明可以在任何地方进行,并且在单个转换单元中可以有多个与您想要的相同名称的声明,但是(非#include "..."
,非模板,非内部链接)定义只能是最多只有一个inline
文件(技术上称为“编译单元”或“翻译单元”),否则在链接时会出现“多重定义”错误。另外值得注意的是,定义也可以作为声明,但不是相反。
在C ++中,在声明之前不能使用名称(函数,结构,变量等),就像在Java中一样,但是可以在定义之前使用它在大多数情况下只需将声明写在使用点之上。
头文件只是让您在所有需要它们的文件中放置声明(以及.cpp
函数定义和模板定义),而无需在每个.cpp文件中反复复制和粘贴它们。你实际上可以在不使用头文件的情况下编写C ++,但这将非常繁琐,并且会有大量的代码重复。
1 非定义的声明示例:
inline
2 定义的例子(也是声明):
extern bool bar;
class c;
int foo();
int foo();
int foo(); // Can have many declarations of the same name as long as they match
答案 1 :(得分:3)
应该......
#include "filetobeloaded.h"
当您包含当前目录中的文件时,您需要将它们放在引号中,而不是放在您拥有的尖括号中。
#include <filetobeloaded.h> //only looks in the systems directory
答案 2 :(得分:3)
在C ++中,您有两种形式的include
#include <somefile.h>
和
#include "somefile.h"
第一个只查看系统目录,而第二个查看当前目录。
答案 3 :(得分:1)
除了其他答案之外,您还需要在.cpp文件中包含 include
行。
另外,我个人会在类中使用方法而不是全局类。 C ++有一个功能,你可以在全局而不是在类中使用方法(和其他东西)。
编辑:由于这些函数不在一个类中并且是全局定义的,因此您不需要include
行。
答案 4 :(得分:0)
另见https://stackoverflow.com/questions/21593/
这个问题可以被视为重复,但措辞与链接的答案不同。从根本上说,C标准并没有严格规定差异,你必须参考编译器的文档以获得明确的答案。