Имеет ли значение порядок компиляции g ++? - PullRequest
10 голосов
/ 11 апреля 2011

Я заметил, что смог скомпилировать дочерний класс перед родительским классом с помощью g ++. Есть ли необходимость компилировать в определенном порядке с учетом зависимостей?

Ответы [ 5 ]

12 голосов
/ 11 апреля 2011

Заказ связывания может иметь значение;порядок компиляции не.

5 голосов
/ 11 апреля 2011

Короче говоря: нет!

Каждый модуль компиляции C ++ (исходный файл C ++) компилируется независимо. Наследование классов и т. Д. Устанавливается во время выполнения. Вот почему у вас могут быть базовые классы в отдельно поддерживаемых библиотеках, которые можно обновлять без принудительной перекомпиляции классов-потомков, если API и ABI остаются совместимыми.

1 голос
/ 11 апреля 2011

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

0 голосов
/ 11 апреля 2011

... Мне удалось скомпилировать дочерний класс перед родительским классом ...

«Компилировать» не является строго определенным термином, поэтому не совсем ясно, чтоВы имеете в виду здесь.Но в целом нет, вы не можете скомпилировать дочерний класс перед родительским классом.В C ++ родительский тип должен быть complete , прежде чем вы сможете использовать его в качестве базового класса для любого другого дочернего класса.Вы либо что-то неверно истолковали, либо даете термину «компилировать» довольно необычное значение.

0 голосов
/ 11 апреля 2011

Чтобы расширить ответ ildjarn, для компиляции реализации дочернего класса требуется только API / контракт родительского класса, а не его реализация.Это будет жить в файле типа Parent.h, который будет включен в файл (ы), содержащие реализацию дочернего элемента.

...