2013-09-22 2 views
0

У меня есть код, который содержит огромное количество файлов cpp/header. Моя проблема заключается в том, что, поскольку многие включают друг друга, я иногда попадаю в ситуацию, когда мой код не компилируется, если я не переупорядочу директивы #include в случайных файлах, которые теперь необходимы в основном с созданием любого другого файла заголовка.Как предотвратить включение обрыва

Это действительно очень раздражает; есть ли какой-либо совет, как мне написать свой код на C++, чтобы предотвратить осложнения с помощью #include? Я бы предпочел разделить мой исходный код на максимально возможное количество файлов, чтобы упростить взаимодействие с другими программистами (с использованием git или svn) (больше файлов - меньшее количество конфликтов редактирования).

Одна из вещей, которые помогают мне сейчас, - это объявление вперед, когда я объявляю классы из других заголовков в другие файлы. Иногда это помогает, но не решает все проблемы; иногда мне просто нужно изменить порядок #include s в случайных заголовочных файлах или объединить несколько файлов.

+1

Какой код вы пишете, где * заказ * в #includes имеет значение? –

+0

это программа QT gui (исходный код @ https://github.com/huggle/huggle3-qt-lx) – Petr

+2

Если вам нужно изменить порядок, возможно, вам не хватает защитников заголовков или пересылаемых объявлений. Или сами ваши заголовки не включают в себя то, что им нужно (хотя попытайтесь уменьшить этот w. Forward decls) –

ответ

1

Не панацея, но мне помогает следующее руководство.

Предполагая, что ваш код состоит из файлов, таких как 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 в другом исходном файле.

+0

Два преимущества включения системных заголовков в первую очередь: (1) он не позволяет макросам в пользовательских файлах висеть системным файлам (2) он работает лучше с предварительно скомпилированными заголовками –

+0

Это не повод для того, чтобы заголовки не включали другие заголовки, в которых они нуждались, конечно , –

+0

Считаете ли вы, что вы могли бы объяснить, при каких условиях, общих для конкретного упорядочения заголовков, дает какие огромные головные боли? Неясно, как это фактически улучшит ситуацию ОП. –

Смежные вопросы