有没有办法不必编写两次函数声明(头文件),并且在用 C++ 编程时仍然保持相同的编译可伸缩性、调试的清晰度和设计的灵活性?
原文由 thewreck 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法不必编写两次函数声明(头文件),并且在用 C++ 编程时仍然保持相同的编译可伸缩性、调试的清晰度和设计的灵活性?
原文由 thewreck 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
1 回答3.3k 阅读
历史上使用听者文件有两个原因。
在编译要使用库或附加文件的程序时提供符号。
隐藏部分执行;保密。
例如,假设您有一个不想暴露给程序其他部分的功能,但想在您的实现中使用。在这种情况下,您将在 CPP 文件中编写函数,但将其保留在头文件之外。您可以使用变量以及任何想要在浸渍中保持私有且您不希望暴露于该源代码的编号的东西来执行此操作。在其他编程语言中,有一个“public”关键字可以防止模块部分暴露给程序的其他部分。在 C 和 C++ 中,文件级别不存在这样的工具,因此需要使用头文件。
头文件并不完美。使用“#include”只会复制您提供的任何文件的内容。当前工作树的单引号和系统安装的标头的 < 和 >。在系统安装的标准组件的 CPP 中,省略了“.h”;只是 C++ 喜欢做自己的事情的另一种方式。如果你想给 ‘#include’ 任何类型的文件,它将被包含在内。它确实不是像 Java、Python 和大多数其他编程语言那样的模块系统。由于标头不是模块,因此需要采取一些额外的步骤才能从中获得类似的功能。 Prepossesser(与所有#keywords 一起使用的东西)将盲目地包含您声明的每个需要在该文件中使用的内容,但是 C 或 C++ 希望在编译中只定义一个符号或含义。如果您使用库,不是 main.cpp,而是在 main 包含的两个文件中,那么您只希望该库包含一次而不是两次。标准库组件经过特殊处理,因此您无需担心在任何地方都使用相同的 C++ 包含。为了使 Prepossesser 第一次看到你的库时它不会再次包含它,你需要使用一个听过的守卫。
听到警卫是最简单的事情。它看起来像这样:
#ifndef LIBRARY_H #define LIBRARY_H
// 在这里写下你的定义。
#万一
像这样评论 ifndef 被认为是好的:
#endif // LIBRARY_H
但是如果你不做评论,编译器不会在意,也不会伤害任何东西。
#ifndef 所做的只是检查 LIBRARY_H 是否等于 0;不明确的。当 LIBRARY_H 为 0 时,它提供 #endif 之前的内容。
然后#define LIBRARY_H 将LIBRARY_H 设置为1,因此下次预处理器看到#ifndef LIBRARY_H 时,它不会再次提供相同的内容。
(LIBRARY_H 应该是文件名,然后是 _ 和扩展名。如果你不写同样的东西,这不会破坏任何东西,但你应该保持一致。至少为#ifndef 输入文件名。否则,可能会混淆警卫的用途。)
真的没有什么想在这里发生的。
现在您不想使用头文件。
太好了,说你不关心:
通过从头文件中排除它们来将它们私有化
您不打算在库中使用此代码。如果您曾经这样做过,现在使用标头可能会更容易,因此您以后不必将代码重新组织到标头中。
您不想在头文件中重复一次,然后在 C++ 文件中重复一次。
听者文件的目的可能看起来模棱两可,如果您不关心人们出于想象的原因说出它是错误的,那么请节省您的手,不要费心重复自己。
如何仅包含听者文件
做
对于thing.cpp。
而对于 main.cpp 做
然后编译。
基本上只需使用 CPP 扩展名命名包含的 CPP 文件,然后将其视为头文件,但在该文件中写出实现。