Скомпилируйте cpp без соответствующего заголовка - PullRequest
0 голосов
/ 27 марта 2012

Мне только что дали мое первое настоящее приложение на C ++ после работы с книгами, изучающими язык.Насколько я понимаю, ваши исходные файлы cpp требовали соответствующего заголовка, но одна из библиотек в моем проекте прекрасно работает с несколькими файлами cpp, которые НЕ включают в себя соответствующий заголовок.Этот конкретный cpp реализует класс, найденный в заголовке с другим именем и рядом других фрагментов кода, помимо первоначального объявления класса.

Как получается, что cpp может компилировать функции, принадлежащие классу, которыйон не знает?

Может ли реализация этих функций быть скомпилирована независимо и просто вызываться, когда клиентское приложение, использующее библиотеку (включая заголовок с объявлением класса), вызывает соответствующую функцию-член?Если это так, как на двоичную реализацию ссылается клиентское приложение?(Я предполагаю, что это компоновщик ... но я бы хотел, чтобы это прояснили).

Я ожидаю, что ответ может выявить мое недопонимание в отношении процесса включения и компиляции, и я быМне действительно нравится хорошо изучать этот аспект C ++.Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Когда исходный файл c ++ компилируется, первый этап, который он проходит, - это предварительная обработка.Когда директива включения достигнута, файл найден, и все содержимое файла, что бы это ни было, включается в исходный файл, как если бы оно было записано в самом исходном файле.

Вы будетевозможность определить любую функцию из класса в любом исходном файле, который включает в себя объявление класса, это исходный файл, «зная» о классе / функции ».

Также не требуется, чтобы содержимое заголовка иисходный файл будет иметь какие-либо отношения. Однако это считается очень хорошей практикой.

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

Единственный другой шаблон, который некоторые люди могут использовать, кроме отношения 1: 1 междуисходные файлыФайлы заголовков nd (о которых я могу думать) состоят в том, что каждый из файлов заголовков описывает класс, и каждый исходный файл реализует набор связанных функций.Но это плохая идея (на мой взгляд), потому что она будет стимулировать определения различных классов, потому что они сильно связаны.

0 голосов
/ 27 марта 2012

Это несколько вопросов.Вы должны попытаться разделить их.

  1. Имя файлов, в которых что-то объявлено, не является релевантным.Компилятор получает выходные данные препроцессора независимо от файлов, которые были прочитаны препроцессором.Компилятор может использовать некоторую информацию о файле / строке в предварительно обработанном файле для выдачи более читаемых диагностических сообщений.Когда вы объявляете класс в заголовочном файле и копируете это объявление в файл реализации, все работает нормально, пока вы не измените одну из копий объявления.Это плохо опасно и его следует избегать.Объявляйте что-либо всегда один раз.

  2. Когда вы компилируете реализацию функции-члена класса, вы получаете функцию, которую компоновщик может связать с вашей клиентской программой.Хорошая цепочка инструментов способна связать только те функции, к которым осуществляется доступ.Таким образом, вы можете отделить интерфейс (в заголовочных файлах) от реализации, которая предоставляется в статической библиотеке.Компоновщик будет добавлять каждый объектный модуль из библиотеки в ваш исполняемый файл до тех пор, пока не будут разрешены все ссылки на символы.

...