2013-12-14 3 views
0

Так что да, вопросы в названии. Но причина, по которой я спрашиваю, заключается в том, что я беру видеоуроки в The New Boston (кстати, это потрясающе), и мне было интересно; Зачем нам сами импортировать библиотеки? и я не имею в виду каждый lib в C++, созданный каждым программистом, но наиболее часто используемые, такие как cstdlib или cmath?Почему не все C++-библиотеки включаются автоматически при запуске?

+3

Зачем компилятор разбирать и компилировать то, что вам может не понадобиться? – jrok

+0

Что вы подразумеваете под «импортом библиотек»? Стандартные библиотеки C и C++ * связаны * с программами по умолчанию. –

+0

** упрощенный ** ответ заключается в том, что компилятор должен был бы прочитать все стандартные .h для каждого из ваших .c, которые были бы медленными. –

ответ

1

Здесь есть две разные вещи. Когда вы создаете приложение, система сборки ссылается на стандартную библиотеку, а компоновщик извлекает любой код из этой библиотеки, а также любые другие, которые вы, возможно, указали.

Что вы говорите здесь о не библиотеки, но заголовки. Заголовки описывают содержимое исходных файлов, поэтому вы можете скомпилировать исходный файл и ссылаться на вещи, которые определены где-то в другом месте. Например,

#include <stdio.h> 

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

Заголовок <stdio.h> сообщает компилятору, что есть функция с именем puts, которая может быть вызвана с строковой литерал ("Hello, world\n") в качестве аргумента. Эта функция определена в стандартной библиотеке, поэтому ссылка на стандартную библиотеку получает код, который делает эту работу.

В отличие от Java, разработчики C++ решили, что компилятор не должен ласкать ваш жесткий диск, чтобы попытаться выяснить, какие вещи вы хотите использовать в своем коде. Вы должны сказать это, и заголовки - это механизм для этого. Использование большего количества заголовков, чем вам нужно, требует обработки большего количества текста, чем вам нужно, а это, в свою очередь, означает более медленную компиляцию.

+0

Ahhh, поэтому у конкретных библиотек есть определенные заголовки, и один из этих libs - это заголовок с именем , который дает вам (функцию). Итак, компилятор похож на каталог, который я предполагаю. Он должен перейти к

, вернитесь к пути, скажем, пути инициализации, а затем перейдите в другой заголовок с этой начальной точки? Если я могу задать другой вопрос, это просто сборник заголовков? Если да, то как вы знаете, какую библиотеку использовать/как ее назвать. Большое спасибо -James. –

+0

Заголовок - это текстовый файл. Когда компилятор видит '#include whatever', он читает текст из этого файла, как если бы он был частью файла, который он компилирует. Больше ничего. На этом этапе я предлагаю вам игнорировать детали заголовков и библиотек. Позже вы начнете писать программы, которые состоят из более чем одного исходного файла, и вы узнаете все о заголовках и ссылке, когда вы это сделаете. –

+0

Сладкий, приветствует человека, спасибо за помощь. Сложно начать программирование (как я уверен, вы знаете), поэтому хорошо, что люди на этом сайте, как и вы, предлагают некоторые рекомендации. –

2

Включая библиотеки. Их символы делают компиляцию более длинной, и они делают полученный исполняемый файл более крупным. Имена в некоторых библиотеках могут конфликтовать с именами в других или с именами в вашем собственном коде. Если они «импортированы» автоматически, то как бы вы их «unimport»? Кто решает, что «широко используется»? Я редко использую stdlib в проектах на C++. Иногда я использую математику, но не часто.

Я не могу придумать язык с «пакетами», который импортирует по умолчанию. (Java, C#, python, C/C++)

+0

' java.lang' автоматически импортируется, нет? Точно так же содержимое «исключений» в Python2, но в Python3 они просто встроены. –

0

Причина, по которой даже стандартные заголовки библиотек C++ не включаются автоматически, потому что это (по крайней мере) значительно увеличило бы время компиляции. См., Включение заголовочного файла просто вставляет его содержимое на сайт оператора #include, поэтому вы можете завершить очень длинную единицу перевода, даже если на самом деле вам не нужен код.

0

Вопрос в том, что если вы включите все, компилятор займет гораздо больше времени для анализа и компиляции ваших проектов. Иногда бывает больно в заднице, когда дело доходит до mpl (мета шаблонная программа), поскольку stl в основном написана в шаблонах.

Но вы можете использовать самые распространенные библиотеки и импортировать их каждый раз, когда вы настраиваете новый проект.

0

«Импорт» - неправильный термин. Эти библиотеки, без файлов заголовков для библиотек, являются «include» d. Файлы #include сообщают компилятору о сигнатуре различных функций и других полезных определениях. Если вы включите все под Солнцем автоматически, это увеличит работу компилятора и приведет к более длительному времени компиляции. Это также заставит компилятор потребовать больше памяти. Дополнительным преимуществом является то, что компилятор знает намерения программиста при наличии соответствующих заголовков.

C/C++ нацелен на то, чтобы держать код плотным, с меньшим размером кода. Они хотят, чтобы использование памяти было максимально эффективным, и эта философия находит свое отражение и в компиляторе.

Смежные вопросы