У меня есть код, который содержит огромное количество файлов cpp / header. Моя проблема сейчас в том, что поскольку многие включают друг друга, я иногда попадаю в ситуацию, когда мой код не компилируется, если я не переупорядочиваю #include
директивы в случайных файлах, что теперь необходимо в основном при создании любого другого заголовочного файла.
Это действительно очень раздражает; есть ли совет, как я должен написать свой код C ++, чтобы предотвратить осложнения с #include
? Я бы предпочел разделить мой исходный код на максимально возможное количество файлов, чтобы облегчить сотрудничество с другими программистами (использующими git или svn) (больше файлов == меньшее количество конфликтов редактирования).
Одна из вещей, которая мне сейчас помогает, это предварительное объявление, когда я объявляю классы из других заголовков в другие файлы. Это помогает иногда, но не решает все проблемы; иногда мне просто нужно изменить порядок #include
s в случайных заголовочных файлах или объединить несколько файлов.
Не панацея, но следующее руководство мне очень помогает.
Предполагая, что ваш код состоит из файлов, таких как MyClassXyz.cpp
с соответствующими MyClassXyz.h
один класс на исходный файл, каждый cpp-файл должен включать соответствующий заголовочный файл первый. То есть, MyClassXyz.cpp
должен начните со следующей строки:
// (possibly after comments)
#include "MyClassXyz.h"
Это гарантирует, что MyClassXyz.h
включает в себя все файлы заголовков (или предварительные объявления), необходимые для его компиляции.
Я часто вижу код, который использует противоположное соглашение (#include
сначала используются самые общие файлы заголовков), например, MyClassXyz.cpp
начинается с
#include <vector>
#include <iosfwd>
#include "blah.h"#include "mytypes.h"#include "MyClassXyz.h"
А также MyClassXyz.h
«идет прямо в точку», используя материал, определенный в дополнительных заголовках:
#pragma once
// "#include <vector>" missing - a hidden error!
// "#include <iosfwd>" missing - a hidden error!
class MyClassXyz
{
std::vector<int> v;
friend std::ostream& operator<<(...);
...
}
Хотя это компилируется нормально, при попытке использования класса возникают колоссальные головные боли описываемого вами типа. MyClassXyz
в каком-то другом исходном файле.
Других решений пока нет …