Кажется, вы спрашиваете об отделении определений от объявлений, хотя есть и другие способы использования файлов заголовков.
Ответ заключается в том, что C ++ в этом «не нуждается». Если вы помечаете все в строке (что в любом случае автоматически для функций-членов, определенных в определении класса), то в разделении нет необходимости. Вы можете просто определить все в файлах заголовков.
Причины, по которым вы можете захотеть разделиться, следующие:
- Чтобы сократить время сборки.
- Для связывания с кодом, не имея источника определений.
- Чтобы не отмечать все как «встроенное».
Если ваш более общий вопрос: «Почему C ++ не идентичен Java?», Тогда я должен спросить: «Почему вы пишете C ++ вместо Java?» ;-п
Однако, если серьезно, причина в том, что компилятор C ++ не может просто подключиться к другой единице перевода и выяснить, как использовать ее символы, как это делает и делает javac. Заголовочный файл необходим для того, чтобы сообщить компилятору, что он может ожидать во время компоновки.
Итак, #include
- это прямая текстовая подстановка. Если вы определяете все в файлах заголовков, препроцессор в конечном итоге создает огромные копии и вставки каждого исходного файла в вашем проекте и передает их в компилятор. Тот факт, что стандарт C ++ был ратифицирован в 1998 году, не имеет к этому никакого отношения, это тот факт, что среда компиляции для C ++ так близко основана на среде C.
Преобразование моих комментариев в ответ на ваш последующий вопрос:
Как компилятор находит файл .cpp с кодом в нем
Это не так, по крайней мере, во время компиляции кода, который использовал файл заголовка. Функции, которые вы связываете, даже не обязательно должны быть написаны, не говоря уже о том, что компилятор знает, в каком .cpp
файле они будут. Все, что вызывающему коду нужно знать во время компиляции, выражается в объявлении функции. Во время компоновки вы предоставите список .o
файлов, статических или динамических библиотек, а заголовок, по сути, является обещанием, что определения функций будут где-то там.
person
Steve Jessop
schedule
20.08.2009