【发布时间】:2021-10-01 22:34:31
【问题描述】:
确定程序编译所需的标头的标准工作流程是什么?
举个简单的例子
#include <iostream>
int main() {
std::cout << CGAL::square(0.002) << '\n';
return 0;
}
函数square在Algebraic_foundations/include/CGAL/number_utils.h中定义。
问题 1:为什么仅仅 #include <CGAL/number_utils.h> 还不够?
我知道#include <CGAL/basic.h> 使程序编译。
我想可以使用更细粒度的文件包含并查看basic.h 我发现#include <CGAL/number_type_basic.h> 就足够了。
问题 2:使用更细粒度的文件包含是否会减少编译时间(编译单元中的文本更少?)但可执行文件/目标文件不会因为编译器从不需要的包含中删除多余的代码而有所不同?
问题 3:为什么要使用更精细的夹杂物还有其他理由吗? 某种风格指南? 或者包含一个高级标头以确保对低级代码的更改安全?
问题 4:CGAL 中有哪些高级标题? 整个图书馆都有一个吗? 所有不同包的连接如何? 每个包裹都有一个吗?
问题 5:如果包含中低级头文件是一种好习惯,那么确定需要哪些头文件的标准工作流程是什么,例如对于上述示例中的square 函数?
【问题讨论】:
-
"确定程序编译需要哪些头文件的标准工作流程是什么?" 没有标准,你必须看看你使用的函数/类在哪里已定义。
-
关于问题 1:如果您的编译器知道在
Algebraic_foundations/include/中查找头文件,例如在编译器调用上使用 -I 开关,那么<CGAL/number_utils.h>将起作用。 -
@WaisKamal 我明确地只使用在
number_utils.h中定义的CGAL::square函数。看起来这个文件依赖于一些它不包含自身的基本框架......? -
@jkb 编译器找到了
number_utils.h,但似乎缺少其他东西(?)。编译器错误发布在this question。 -
对于这种特殊情况,
CGAL/number_utils.h声明square,但您还需要CGAL/double.h来专门化double。在实践中,您通常包含内核头文件,其中包含足够多的基本头文件,因此您无需担心。
标签: c++ header-files cgal