проблема h и hpp, неправильный порядок включения - PullRequest
1 голос
/ 17 июля 2011

Я собираю большой проект, содержащий> 500 классов.После компиляции VS 2010 проблем не было.При использовании g ++ (Code :: Blocks / Netbeans) в Windows код не будет компилироваться со следующей ошибкой:

library/source/algorithms/file/../../algorithms/graph/../algebra/../spheredistance
/file.hpp:31:51: fatal error: ../../exception/ErrorOverflow.h: No such file or directory. 
Compilation terminated.

Однако этот файл существует по указанному пути.Версия для Linux работает правильно.Символ / или \ в пути не имеет значения (проверено).

Если I изменить порядок включаемых файлов , вышеупомянутая ошибка исчезает, и аналогичная ошибка появляется в другом месте кода ...

Я думаю, что где-то в коде есть циклическая зависимость или неправильный порядок включаемых файлов.

Структура файла:

1) .cpp file

#include "file.h"

2) .h файл

#ifndef file_H
#define file_H

template <typename T>
class Class 
{
};

#include "file.hpp"
#endif

3) .hpp файл

#ifndef file_HPP
#define file_HPP

#include "../../somefile.h"

template <typename T>
class Class 
{

};

#endif

Большинство заголовочных файлов * .h включены в файлы * .hpp, но вДля некоторых файлов * .h необходимо включить другой файл * .h.Короткий и упрощенный пример, иллюстрирующий округление вкл / выкл результата:

Orientation.h
#ifndef Orientation_H
#define Orientation_H


typedef enum
{
    RoundOn, RoundOff
} TRound;


class Orientation
{
    public:
            template <typename T>
            static short getOrientation( const T dx1, const T dy1, const T dx2, const T dy2, const TRound round = RoundOff );
};

Некоторая классовая позиция: метод дает результаты округления / округления

#include "Orientation.hpp"

Position.hpp
#ifndef Position_H
#define Position_H

#include "../orientation/Orientation.h"  //must be included for Rounding


class Position
{
    public:
            template <typename Point1, typename Point2>
            static unsigned short getPosition ( const Point1 * p, const Point2 * p1, const Point2 * p2, const TRoundType round );
};

#include "Position.hpp"

#endif

Пожалуйста, сообщите:

  • какая политика заголовка / включения подходит для такого большого проекта.
  • как найти заголовки с неправильным порядком включения (если это возможно)
  • как реорганизоватьэтот проект, чтобы избежать вышеупомянутых проблем.

ОБНОВЛЕННЫЕ РЕЗУЛЬТАТЫ:

Спасибо всем за ваш полезный совет.

Iизвините, я был полностью неправНа самом деле была ошибка в относительном пути , содержащая символы .. (двойная точка)

После переписывания всех директив include все в порядке.

1 Ответ

3 голосов
/ 17 июля 2011

Однако этот файл существует по указанному пути

Нет, это не так.

Хотя вы правы в том, что циклическое включение может привести к ошибочным сообщениям об ошибках, но это не одно из них.

Следует иметь в виду, что разрешение путей включения определяется реализацией (2003: 12.8 / 1), что может быть причиной несогласованности между цепями инструментов. Использование относительных путей особенно любопытно. Упростите дерево исходного кода и пути включения, и эта проблема исчезнет.

...