【问题标题】:CGAL: Which headers to includeCGAL:要包含哪些标题
【发布时间】:2021-10-01 22:34:31
【问题描述】:

确定程序编译所需的标头的标准工作流程是什么?

举个简单的例子

#include <iostream>
int main() {
  std::cout << CGAL::square(0.002) << '\n';
  return 0;
}

函数squareAlgebraic_foundations/include/CGAL/number_utils.h中定义。

问题 1:为什么仅仅 #include &lt;CGAL/number_utils.h&gt; 还不够?

我知道#include &lt;CGAL/basic.h&gt; 使程序编译。 我想可以使用更细粒度的文件包含并查看basic.h 我发现#include &lt;CGAL/number_type_basic.h&gt; 就足够了。

问题 2:使用更细粒度的文件包含是否会减少编译时间(编译单元中的文本更少?)但可执行文件/目标文件不会因为编译器从不需要的包含中删除多余的代码而有所不同?

问题 3:为什么要使用更精细的夹杂物还有其他理由吗? 某种风格指南? 或者包含一个高级标头以确保对低级代码的更改安全?

问题 4:CGAL 中有哪些高级标题? 整个图书馆都有一个吗? 所有不同包的连接如何? 每个包裹都有一个吗?

问题 5:如果包含中低级头文件是一种好习惯,那么确定需要哪些头文件的标准工作流程是什么,例如对于上述示例中的square 函数?

【问题讨论】:

  • "确定程序编译需要哪些头文件的标准工作流程是什么?" 没有标准,你必须看看你使用的函数/类在哪里已定义。
  • 关于问题 1:如果您的编译器知道在 Algebraic_foundations/include/ 中查找头文件,例如在编译器调用上使用 -I 开关,那么 &lt;CGAL/number_utils.h&gt; 将起作用。
  • @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


【解决方案1】:

几乎所有的参考手册页,例如 Triangulation_2 类中的一个,都会首先给出要包含哪个头文件的信息。 所有更高级别的数据结构都使用 geometric traits 类 进行参数化,在大多数情况下它们会传递一个内核,例如 Exact_predicates_inexact_constructions_kernel,它再次声明要包含的标头。后者将定义包括所有基础设施的数字类型。 请注意,CGAL/basic.h 未记录在案。

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多