Мне нравится организовывать свой код, поэтому в идеале я хочу один класс для каждого файла или, когда у меня есть функции, не являющиеся членами, одна функция для каждого файла.
Причины:
-
Когда я прочитаю код, я всегда буду знать, в каком файле я должен найти определенной функции или класса.
-
Если это один класс или один нечлен функции в файле заголовка, тогда я не буду включать целый беспорядок, когда я
include
заголовочный файл. -
Если я сделаю небольшое изменение в функции, тогда только эта функция должна быть перекомпилирована.
Однако, разбивая все на многие заголовки, и многие файлы реализации могут значительно замедлить компиляцию. В моем проекте большинство функций обращаются к определенному числу шаблонных других функций библиотеки. Так что код будет компилироваться снова и снова, один раз для каждого файла реализации. Компиляция всего моего проекта в настоящее время занимает 45 минут или около того на одном компьютере. Существует около 50 объектных файлов, и каждый из них использует те же самые дорогие компиляции заголовков.
Может быть, допустимо ли иметь один класс (или не-членную функцию) в заголовочном файле, но помещать реализации многих или всех этих функций в один файл реализации, как в следующем примере?
// foo.h
void foo(int n);
// bar.h
void bar(double d);
// foobar.cpp
#include <vector>
void foo(int n) { std::vector<int> v; ... }
void bar(double d) { std::vector<int> w; ... }
Опять же, преимущество состоит в том, что я могу включить только функцию foo или только функцию бара, а компиляция всего проекта будет быстрее, потому что foobar.cpp
- это один файл, поэтому std::vector<int>
(который является просто пример здесь для какой-либо другой дорогостоящей компиляции шаблонов) должен быть скомпилирован только один раз, а не в два раза, если я скомпилировал foo.cpp
и bar.cpp
отдельно. Конечно, моя причина (3) выше не подходит для этого сценария: После простого изменения foo() {...} мне нужно перекомпилировать весь потенциально большой файл foobar.cpp
.
Мне любопытно, каковы ваши мнения!