Включая стиль заголовочных файлов - C++

У меня есть проект, который имеет следующую структуру каталогов.

root
--include
----module1
----module2
--src
----module1
----module2

Так файл говорят foo.cpp в src/module1 должен включать как,

#include "../../include/module1/foo.hpp"

Это выглядит грязным и жестким для записи. Я нашел, что запись включает как

#include <module1/foo.h>

и обеспечение включает путь поиска файла к root/include при компиляции аккуратных взглядов. Однако я не уверен, что этот стиль имеет любые недостатки.

Какой Вы предпочитаете и почему? Также Вы видите какие-либо проблемы в организации файлов вышеупомянутым способом?

8
задан Navaneeth K N 28 January 2010 в 17:01
поделиться

7 ответов

Функция user32 MoneyStartWindow Window позволяет передать hwnd и возвращает дескриптор монитору, на котором он находится (или по умолчанию - см. связанную статью MSDN). С помощью этой функции можно вызвать GetMoneyInfo для получения структуры MONITORINFO , которая содержит RECT, детализирующий ее разрешение.

Для получения дополнительной информации см. раздел Multiple Screen Reference в MSDN.

Я бы добавил пример кода, но я не знаю язык, на который вы ссылаетесь, и я не знаю, насколько полезным будет для вас пример кода C #. Если вы думаете, что это поможет, дайте мне знать, и я быстро запишу кое-что.

-121--2330591-

Использование ILMerge : Объединение сборок .NET с помощью ILMerge

-121--3995745-
#include "../../include/module1/foo.hpp"

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

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

Из моей копии черновика C++:

16,2 Включение исходного файла

2 Директива предварительной обработки формы

#include <h-char-sequence> new-line`

выполняет поиск последовательности места, определенные для реализации заголовок, однозначно идентифицированный указанная последовательность между < и > разделители и вызывает замену этой директивы всем содержимое заголовка. Как места указаны или определен заголовок определяется реализацией.

3 А директива предварительной обработки формы

# include "q-char-sequence" new-line 

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

#include <h-char-sequence> new-line`

с идентичной содержащейся последовательностью (включая > символы, если таковые имеются) из оригинал директивы.

7 Хотя реализация может обеспечить механизм для создания произвольные исходные файлы, доступные для поиск < >, в общем программисты следует использовать форму < > для заголовков обеспеченных реализацией, и форма «» для источников за пределами контроль за реализацией.

4
ответ дан 5 December 2019 в 15:23
поделиться

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

module1/%.cc: -I $ROOT/includes/module1

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

// module1/abc.cc
#include <abc.h>
#include <module2/def.h>
1
ответ дан 5 December 2019 в 15:23
поделиться

Я предпочитаю 2-й способ

#include <module1/foo.h>

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

1
ответ дан 5 December 2019 в 15:23
поделиться

Руководство по стилю Google C ++ имеет раздел в этом, где они обсуждают упорядочение и именование включения. Он в основном согласен с тем, что было сказано в других ответах до сих пор, но стоит посмотреть, как это очень специфично.

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

Насколько это далеко от разделяющего источника и включает файлы на два разных под деревья: почему бы не проживают заголовки рядом с исходными файлами? Это облегчает их сопоставить. Если вы не ожидаете, что другие проекты используют ваши заголовки и просто связываете со своими дворами, я думаю.
<плечами />

1
ответ дан 5 December 2019 в 15:23
поделиться

Использование ILMerge : Объединение сборок .NET с помощью ILMerge

-121--3995745-

ILMerge хорошо работает и делает это, по большей части.

Имейте в виду, что есть проблемы, если вы делаете это с сборками WPF, содержащими Я подозреваю, что проекты Workflow 4 могут иметь те же проблемы. Встроенный Xaml неправильно объединяется с ILMerge.

Существуют некоторые коммерческие инструменты, однако утверждение о поддержке объединения сборки с проектами WPF, включая .NET Reactor и SmartAssembly .

-121--3995746-

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

1
ответ дан 5 December 2019 в 15:23
поделиться

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

Файлы могут перемещаться

. Они будут. Ваша иерархия изменится. Вы можете поставить файлы на другой диск. Они могут изменить местоположение, когда другой пользователь изменяет ваш код. Файлы могут перемещаться, когда они портированы для другого проекта. Нет ничего, не позволяя вашим файлам двигаться.

Перемещение файлов без измененийки

Знание того, что файлы будут перемещаться, если путь находится в файле, файл должен быть изменен при перемещении. Без пути в файле только инструкции по сборке необходимо изменить. С большими проектами, модификация многих файлов - боль (даже с скриптами).

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

1
ответ дан 5 December 2019 в 15:23
поделиться

Я поддерживаю оба стиля ... для разных видов использования

Давайте предположим, что у вас также есть каталог root / src / common с целью моего примера

// in src/module1/foo.cpp
#include "module1/foo.h"

#include "../common/stringProcessing.h"

включает

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

Также всегда есть риск, используя «...», что он не идет туда, куда вы думаете из-за символической связи, пройденной назад: /

Источник

Иногда у вас есть заголовки, которые не являются публичными, и, таким образом, Не в включают в себя каталог . Они обычно для деталей реализации, которые не актуальны для ваших клиентов. Для тех, которые я использую .. Если это нужно, и точное местоположение.

Это позволяет: - не загромождать -I со всеми возможными каталогами SRC - Легко найти файл среди ваших источников - Легко тестируйте на зависимости от ваших источников (GREP для .. )

MICC

Если я должен набрать

#include "module/foo.h"

, то я ожидаю использовать:

module::Foo myClass;

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

Требование одна библиотека - одно пространство имен с одинаковыми именами, позволяет легко ориентироваться на одном ~ 300 или ~ 400 компонентов, которые мы имеем на работе: нам пришлось работать какой-то способ организовать их!

Это означает, что ваш начальный макет переработан как (для модуля модуля ):

root
-- include
---- module
------ part1
------ part2
-- src
---- part1
---- part2

, и вы тогда используете следующую директиву: -I / Path ../ root / включить И я ожидаю, что вы создадите либо библиотеку libmodule.so или модуль двоичных данных.

2
ответ дан 5 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: