Как я могу избежать явного объявления путей к каталогам в директивах C или C ++ #include? - PullRequest
2 голосов
/ 30 апреля 2010

Я делаю симулятор и написал много файлов и заголовков. Проблема в том, что когда я включаю файл, я указываю относительный путь к конкретному файлу. Например, типичный код в моем приложении будет начинаться как

#ifndef AI_H
#define AI_H

#include <cstdlib>

#include "../world/world.h"
#include "pathPlan.h"
#include "skills/tryskill.h"
#include "../info/condition.h"
#include "dataStructures/destination.h"
#include "../params/gamePlay.h"
#include "../modules/controlModule.h"


class ai
{
    public:

etc etc

Я хочу избежать использования относительных путей. Например, я хочу напрямую включить «tryskill.h» и «destination.h» без указания абсолютных путей Таким образом, мне не нужно беспокоиться, если я изменю местоположение какого-либо конкретного файла. Я использую Ubuntu 9.10. Любая помощь будет высоко оценен.

Ответы [ 6 ]

2 голосов
/ 30 апреля 2010

Пища для размышлений: какая альтернатива?

#include "pathPlan.h"
#include "exception.h"
#include "world.h"
#include "exception.h" // uh ?

Я всегда опасался иметь слишком много путей, объявленных в переменной include paths, проблема в том, что чем больше путей, тем больше вероятность того, что вы столкнетесь с именем файла, и это на самом деле раздражает отладку. 1004 *

Я предпочитаю использовать это:

// 3rd party libraries
#include <3rdParty1/foo.h>
#include <3rdParty2/foo.h>

// Projects I depend on
#include "myProject1/bar.h"

// Current project, from the include directory
#include "currentProject/foobar.h"
#include "currentProject/another.h"

// Current project, from the source directory (private includes)
#include "../world.h"
#include "../detail/helper.h"

Что означает для данного проекта "вещь", у меня есть следующий файл:

// in thingy/1-3-0-2/include/thingy/foo.h

namespace thingy  // base namespace is project name
                  // namespace hierarchy identical to folders hierarchy
{
}

И тогда у меня в строке компиляции есть следующее:

-I${Repository}/thingy/1-3-0-2/include

Конечно, это немного больше печатать, но это помогает сохранить порядок:

  • корреляция пространства имен / папки облегчает поиск местоположения файла
  • Префикс проектов делает невозможным смешивание двух файлов из разных проектов, даже если они имеют одинаковые имена
2 голосов
/ 30 апреля 2010

На самом деле все зависит от вашего пути включения, разные компиляторы могут называть это по-разному, но в gcc

-Idir  Append directory dir to the list of directories searched for include files.

Так что в вашем примере вы бы указали ../world etc... в списке каталогов в -I

2 голосов
/ 30 апреля 2010

Как правило, если вы компилируете из командной строки, вы должны указать пути поиска для включения в ваш компилятор (пример gcc: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html). Если вы используете IDE, у вас должна быть возможность указать включение поиска пути к вашей IDE, и ваша IDE передаст их вашему компилятору.

1 голос
/ 30 апреля 2010

Вы должны использовать пути, относящиеся к пути включения верхнего уровня вашей программы / библиотеки. Есть много разных способов сделать это, в зависимости от того, как вы строите свою программу. Если вы используете систему сборки CMake - которую я настоятельно рекомендую вам использовать - тогда вы должны использовать команду INCLUDE_DIRECTORIES:

INCLUDE_DIRECTORIES(include)

Если ваш файл «info / condition.h» находится в «include / blah / info / condition.h», то вы должны включить его в:

#include <blah/info/condition.h>

Если вы компилируете из командной строки с помощью g ++, вы можете использовать ключ командной строки -I:

g++ file1.cpp file2.cpp ... fileN.cpp -I./include

Если вы используете Make, вы можете убедиться, что этот флаг используется, добавив следующую строку:

CPPFLAGS += -I./include

Другая возможность, хотя я ее не рекомендую, - это определить переменную среды CPATH:

# Note the following is what you would do in BASH:
export CPATH="$CPATH":"`pwd`/include"
1 голос
/ 30 апреля 2010

Компиляторы позволят вам указать в командной строке (или файле ответа / конфигурации) каталоги для поиска файлов заголовков. Обычно вы можете настроить это в make-файле или в настройках проекта IDE, если вы ведете сборку с помощью одного из этих инструментов.

Однако в целом я предпочитаю указывать относительный путь для заголовков, которые «принадлежат» проекту (в отличие от, возможно, библиотек, которые используются в разных проектах). Таким образом, когда вы добавляете новый модуль, вам не нужно копаться в настройках проекта или создавать файлы, чтобы заставить вещи продолжать сборку.

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

0 голосов
/ 30 апреля 2010

Любая хорошая IDE или makefile позволит вам перечислить относительные пути поиска файлов.Посмотрите на это для вашего решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...