Порядок Заголовка C++ [закрывается]

Я думаю, что это более подходит

 class Maker
{
    public $array = [];
    function set($key, $value = [])
    {
        $this->array[$key] = $value;
    }
}

$maker = new Maker();
$maker->set('a', array( 'VAL1', 1 ));
$maker->set('b', array( 'VAL1', array ( 'VAL2', 2 ) ));
$maker->set('c' , array( 'VAL1', array ( 'VAL2', array ( 'VAL3', 3 )  ) ));

var_dump($maker->array);
34
задан Deduplicator 17 August 2015 в 20:43
поделиться

10 ответов

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

В исходном файле:

  • соответствовавший заголовочный файл
  • необходимые заголовки проекта
  • Сторонние заголовки библиотек
  • стандартные заголовки библиотек
  • системные заголовки

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

63
ответ дан 27 November 2019 в 16:08
поделиться

Хорошая практика: каждый.h файл должен иметь .cpp, который включает это.h сначала перед чем-либо еще. Это доказывает, что любой.h файл может быть помещен сначала.

Даже если заголовок не требует никакой реализации, Вы делаете .cpp, который просто включает это.h файл и ничто иное.

Это затем означает, что можно ответить вопрос любым путем, Вам нравится. Не имеет значения, что приказывает, чтобы Вы включали их в.

Для дальнейших больших подсказок попробуйте эту книгу: крупномасштабная Разработка программного обеспечения C++ - это - позор, это настолько дорого, но это - практически практические советы для освоения системы для расположения исходного кода C++.

21
ответ дан 27 November 2019 в 16:08
поделиться

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

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

Относительно этого оператора

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

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

#ifndef FOO_HEADER_H
#define FOO_HEADER_H
...
#endif

Править

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

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

//foo.cpp
#include "foo.hpp"

#include <my_library.hpp>
// other headers related to my_library

#include <QtCore/qalgorithms.h>
// other Qt headers

#include <boost/format.hpp> // Boost is arguably more standard than Qt
// other boost headers

#include <algorithms>
// other standard algorithms

Причина, почему я делаю, который должен обнаружить недостающие зависимости в моих собственных заголовках: давайте примем, например, это my_library.hpp использование std::copy, но не включает <algorithm>. Если я включаю его после <algorithm> в foo.cpp, эта недостающая зависимость останется незамеченной. Наоборот, с порядком я просто представил, компилятор будет жаловаться это std::copy не был объявлен, позволив мне исправить my_library.hpp.

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

На заметке на полях хорошая практика должна также ограничить в максимуме зависимость между заголовочными файлами. Файлы должны включать как можно меньше заголовков, особенно файл заголовков. Действительно, чем больше заголовков Вы включаете, тем больше кода должно быть перекомпилировано, когда что-то изменяется. Хороший способ ограничить эти зависимости состоит в том, чтобы использовать предописание, которое очень часто достаточно в заголовочных файлах (см., Когда я могу использовать предописание?).

6
ответ дан 27 November 2019 в 16:08
поделиться

Google руководство по стилю C++, имена и порядок включает:

В dir/foo.cc, основная цель которого состоит в том, чтобы реализовать или протестировать материал в dir2/foo2.h, заказать Ваш, включает следующим образом:

  • dir2/foo2.h (предпочтенное местоположение — посмотрите детали ниже).
  • C системные файлы.
  • Системные файлы C++.
  • .h файлы других библиотек.
  • .h файлы Вашего проекта.
5
ответ дан 27 November 2019 в 16:08
поделиться

Я раньше заказывал им в алфавитном порядке (легче найти)

3
ответ дан 27 November 2019 в 16:08
поделиться

"Как" не очевидно, но, "какой". Ваша цель состоит в том, чтобы удостовериться, что порядок, в который Вы включаете заголовочные файлы, никогда не имеет значения (и я имею в виду "НИКОГДА!").

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

2
ответ дан 27 November 2019 в 16:08
поделиться

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

1
ответ дан 27 November 2019 в 16:08
поделиться

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

#ifndef MY_HEADER_H
#define MY_HEADER_H
//...
#endif

Проблема не настолько очевидна в начале, но поскольку сложность Вашего программного обеспечения растет так делает Ваши зависимости. Можно преуспеть и быть умными об этом, но большие проекты C++ обычно пронизываются, включает. Можно попробовать, но можно только сделать так много. Так будьте прилежны и думайте о Вашем, включает, ДА! Но у Вас несомненно будут циклические зависимости в какой-то момент, и именно поэтому Вам нужна защита включения.

0
ответ дан 27 November 2019 в 16:08
поделиться

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

Попытайтесь структурировать свой код, таким образом, Вы передаете указатели или ссылки и вперед объявляете, где Вы можете.

В реализации затем заголовок, который определяет его, должен быть перечислен сначала (кроме Visual Studio при использовании pch затем stdafx, пошел бы сначала).

Я обычно перечисляю их, поскольку мне нужно.

0
ответ дан 27 November 2019 в 16:08
поделиться

Я нашел следующую конвенцию самым полезным:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project

Важная вещь состоит в том, чтобы поместить заголовок модуля как первый непредварительно скомпилированный заголовок. Это гарантирует, что "module.h" не имеет никаких неожиданных зависимостей.

Если Вы работаете над крупным проектом с медленными временами доступа к диску, я видел, что этот стиль раньше уменьшал время изготовления:

module.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
#if !defined _OTHER_MODULE_GUARD_
#include "other_module.h"
#endif 

#if !defined _ANOTHER_MODULE_GUARD_
#include "another_module.h"
#endif 

Это является немного подробным, но действительно экономит на диске, ища, так как заголовок не будет разыскиваться / открытый, если это было уже включено. Без защитной проверки компилятор будет искать и открывать заголовочный файл, анализировать целый файл для окончания #ifdefлуг целый файл.

-1
ответ дан 27 November 2019 в 16:08
поделиться
Другие вопросы по тегам:

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