为什么启动时不会自动包含所有c ++库?

时间:2013-12-14 14:18:35

标签: c++

所以是的,标题中的问题。但我之所以要问的原因是因为我正在新波士顿观看视频教程(顺便说一句,这很棒)我想知道;为什么我们自己要导入这些库?我并不是指每个程序员创建的c ++中的每个lib,而是最常用的lib,如cstdlib或cmath?

5 个答案:

答案 0 :(得分:2)

包括图书馆有成本。它们的符号使编译花费的时间更长,它们使得生成的可执行文件更大某些库中的名称可能与其他库中的名称冲突,或者与您自己的代码中的名称冲突。如果自动“导入”,那么你将如何“不引入”它们?谁决定什么是“常用”?我很少在C ++项目中使用stdlib。我有时会使用数学,但不经常。

我想不出一种默认导入任何“package”的语言。 (Java,C#,python,C / C ++)

答案 1 :(得分:1)

这里涉及两件不同的事情。构建应用程序时,构建系统链接到标准库,链接器会从该库以及您可能指定的任何其他代码中提取所需的代码。

您在这里讨论的是库,但标题。标头描述了源文件的内容,因此您可以编译源文件并引用其他地方定义的内容。例如,

#include <stdio.h>

int main() {
    puts("Hello, world");
    return 0;
}

标头<stdio.h>告诉编译器,有一个名为puts的函数可以用字符串文字("Hello, world\n")作为参数调用。此函数在标准库中定义,因此链接到标准库可以获得使其工作的代码。

与Java不同,C ++的设计者认为编译器不应该通过你的硬盘来试图弄清楚你想在代码中使用什么。你必须告诉它,标题是这样做的机制。使用比您需要的更多标题意味着处理的文本超出了您的需要,反过来意味着编译速度变慢。

答案 2 :(得分:0)

甚至标准C ++库头文件不会自动包含的原因是因为这会(至少)显着增加编译时间。请注意,包含头文件只是在#include语句的站点上粘贴其内容,因此即使您实际上不需要包含的代码,也可能以非常长的翻译单元结束。

答案 3 :(得分:0)

问题是,如果包含所有内容,编译器将花费更长的时间来解析和编译项目。特别是在谈到时,这是一种痛苦 mpl(元模板程序)因为stl主要是用模板编写的。

但您可以考虑最常见的库,并在每次设置新项目时导入它们。

答案 4 :(得分:0)

“导入”不是正确的术语。那些库,没有库的头文件,是“包含”d。 #include文件通知编译器有关不同函数的签名和其他有用的定义。如果将所有内容自动包含在Sun下,则会增加编译器的工作并导致更长的编译时间。它还会使编译器需要更多内存。另一个好处是,当提供适当的头文件时,编译器知道程序员的意图。

C / C ++旨在保持代码紧凑,代码占用空间更小。他们希望将内存的使用保持为最有效的,并且这种理念也反映在编译器中。