Где начинается компилятор C ++? - PullRequest
2 голосов
/ 14 декабря 2009

Если у вас есть проект c ++ с несколькими исходными файлами, и вы нажимаете compile, с какого файла начинается компилятор?

Я спрашиваю, потому что у меня возникли некоторые проблемы # include-зависимости в библиотеке.

Компилятор будет: VC2003.

Ответы [ 9 ]

15 голосов
/ 14 декабря 2009

Не должно зависеть от заказа. Единственные соответствующие шаги:

  1. Каждая единица компиляции включает в себя то, от чего она зависит, и должна компилироваться индивидуально. Это означает, во-первых, что каждый файл CPP включает все заголовки, от которых он зависит; и, во-вторых, каждый заголовок, в свою очередь, должен включать то, что ему нужно, чтобы он мог компилироваться, даже если он компилируется первым.
  2. Шаг связывания объединяет весь скомпилированный объектный код и создает окончательный двоичный файл.
5 голосов
/ 14 декабря 2009

Не имеет значения, с какого файла он запускается, компоновщик разрешает внешние ссылки после того, как все файлы были скомпилированы

4 голосов
/ 14 декабря 2009

Ненужные. Отправьте точную проблему. Порядок компиляции является недетерминированным и произвольным, и не должен влиять на компиляцию вашего проекта.

3 голосов
/ 14 декабря 2009

Это зависит от окружающей среды. В общем случае «компилятор» работает только с одним исходным файлом одновременно; Вы используете высокоуровневые инструменты для управления им и вычисления правильного порядка сборки.

Примерами таких инструментов могут быть make, ant, CMake, SCons, Eclipse и Visual Studio. Основной проверкой обычно является дата изменения файлов исходного кода в сочетании со встроенными и пользовательскими правилами, которые определяют, как различные выходные файлы зависят от входных данных.

1 голос
/ 14 декабря 2009

Другие уже говорили, что заказ не должен иметь значения.

Что вы, возможно, не поняли, так это то, что компилятор компилирует каждый файл .cpp или .cc. Он не компилирует заголовочные файлы. И, как правило, у вас есть только #include заголовочные файлы и никогда .cpp файлов, поэтому порядок не имеет значения. Каждый .cpp файл обрабатывается изолированно. Он включает в себя несколько заголовков, но они никогда не компилируются отдельно, и он не обычно включает в себя и другие .cpp файлы.

1 голос
/ 14 декабря 2009

Единственная проблема «включения-зависимости», о которой я могу думать, - это рекурсивное включение. Для которого исправление обычно защищает его с #ifdef

#ifndef INCLUDED_THEFILENAME_H
#define INCLUDED_THEFILENAME_H

/* content goes here *

#endif

Но вам лучше уточнить вопрос, который у вас есть.

1 голос
/ 14 декабря 2009

Порядок, в котором компилируется компилятор, не должен иметь значения, как отмечали другие.

С точки зрения компилятора, когда вы компилируете файл с #include, включенный файл вставляется в файл, который компилируется в точке, где находится #include, и при необходимости повторяется.

0 голосов
/ 14 декабря 2009

Инструмент make создает направленный ациклический граф зависимостей, указанных в файле make. Это обычно говорит, что исполняемый файл зависит от количества объектных файлов. Объектные файлы зависят от исходных файлов, каждый исходный файл зависит от заголовков и т. Д.

Это создает по существу многоходовое дерево. Дерево будет иметь исполняемый файл в качестве своего корня, и, как правило, заголовочные узлы будут иметь главным образом заголовки (хотя, если вы используете какой-либо генератор кода, он также может иметь входной файл для этого генератора кода в качестве листа).

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

0 голосов
/ 14 декабря 2009

Как уже отмечали другие, концептуально не важно, с какого файла он начинается. Однако может быть полезно начать с самого последнего отредактированного файла (при условии, что было отредактировано более одного файла) или файла с наибольшим количеством зависимостей. В некоторых средах, таких как Code :: Blocks, на самом деле вы можете присваивать веса исходным файлам, чтобы вы могли контролировать порядок компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...