我如何导入头文件是否重要?我看过双引号和箭头.
#include <stdlib.h>
#include "Some_Header.h"
Run Code Online (Sandbox Code Playgroud)
如果他们也以某种方式资本化是否重要?试验这一点似乎无关紧要,但我认为教学必须有这样做的理由.
另一个问题是,(来自Java这里),如何访问其定义的文件之外的类?说,我有one.cpp和two.cpp.
在one.cpp中:
class Something {
...
Run Code Online (Sandbox Code Playgroud)
在two.cpp中:
class SomethingElse {
Something *example;
...
Run Code Online (Sandbox Code Playgroud)
像那样?在Java中,您只需在"public"前面添加一个类名.在C++中,争论类似乎有点困难.
Gre*_*ill 28
#include指令中的尖括号表示搜索路径仅限于"system"包含目录.双引号表示搜索路径包括当前目录,后跟系统包含目录.
当您的操作系统使用区分大小写的文件系统时,文件名的大小写很重要.听起来您可能正在使用Windows或Mac OS X,其中文件名默认情况下不区分大小写.
尖括号在系统标题目录中查找标题(例如/usr/include).引号只是一个绝对或相对的路径名,例如/path/to/header.h或../headers/abc.h.
要从其他文件访问类,只需#include使用该类的其他文件.请务必构建程序,以便不会多次包含任何文件.
问题1
我如何导入头文件是否重要?如果他们也以某种方式资本化是否重要?
没关系,但通常的做法是,
问题2和3
另一个问题是,(来自Java这里),如何访问其定义的文件之外的类?
您需要将类定义放在头文件中,并将该头文件包含在要使用该类的任何位置.对于您的情况,它将如下所示.
//One.h
#ifndef ONE_H
#define ONE_H
class Something
{
public:
void doSomething(){}
};
#endif
//Two.cpp
#include "One.h"
class SomethingElse
{
SomeThing *example;
};
Run Code Online (Sandbox Code Playgroud)
首先是简单的问题:
如果他们也以某种方式资本化是否重要?
在大多数情况下,includes请参阅文件,编译器应该能够找到您在系统中包含的文件.因此,大写在文件系统区分大小写的所有系统中都很重要.如果你想保持最低的可移植性,你应该在文件的名称和include.(默认情况下,所有linux 和mac os都有区分大小写的文件系统,在windows中你可以配置NTFS也区分大小写)
现在,文件的命名方式实际上是否重要?不,它没有,只要你在夹杂物中保持一致.另请注意,建议遵循模式以简化包含.
我如何导入头文件是否重要?
到目前为止标准还不是很清楚,不同的实现遵循不同的路径.标准定义它们可能不同,因为编译器将搜索包含文件的位置和顺序是实现定义的,如果包含使用尖括号或双引号,则可能不同.如果包含引号无法找到文件,则编译器必须回退以处理包含,就好像它是用尖括号编写的一样.
#include <x.h> // search in order in set1 of directories
#include "x.h" // search in order in set2 of directories
// if search fails, search also in set1
Run Code Online (Sandbox Code Playgroud)
这意味着如果文件仅出现在set1中,则两种类型的包含都将找到它.如果set2中存在文件而不是set1,则只有引用包含它才能找到它.如果set1和set2中存在具有相同名称的不同文件,则每个包含类型将查找并包含不同的文件.如果set1和set2的公共子集中存在两个具有相同名称的文件,但集合的顺序不同,则每个包含类型可以找到不同的文件.
回到现实世界,大多数编译器将仅包含set2中的当前目录,其中set1是所有系统包含位置(通常可以使用编译器参数进行扩展)在这些情况下,如果文件仅存在于当前目录中,#include "a.h"将找到它,但#include <a.h>不会.
现在,无论这是否是常见的行为,都有一些隐含的语义在C/C++中是惯用的.通常,方括号用于包括系统头和外部头,而双引号用于包括本地文件.关于同一项目中的图书馆是否应被视为本地或外部,存在灰色区域.也就是说,即使始终包含双引号也行,大多数人都会使用角度引用来引用不属于当前模块的标题.
最后,虽然我所知道的编译器没有这样做,但标准允许实现(编译器)不将标准头文件生成为真实文件,而是在内部处理标准头文件的包含.这是理论上#include "vector"可能无法包含std::vector类(或任何其他标准头)的定义的唯一情况.但这不是一个实际问题,我认为它永远不会存在.