Нужно ли олимпиадное программирование

Мне нужно серьезное уточнение документации вокруг списков модулей и зависимостей, включений и т. Д. Это довольно запутанно, и документация немного коротка для новичков, которые все еще не знают. Как работает Unreal build system. Даже после прочтения доступных документов, и я думаю. Что это еще более расстраивает людей. Впервые знакомых с c++. В отличие от меня.

В файле build.cs вам нужно заполнить несколько списков, но люди, похоже, делают это, используя каждый модуль, который. По их мнению. Им понадобится. Не понимая толком. Что происходит.

Я тоже так делал но теперь у меня серьезные проблемы с включением и мне нужно понять это навсегда:


Сначала об этих двоих:

*PublicIncludePathModuleNames
Список имен модулей (путь не требуется) с заголовочными файлами. К которым требуется доступ к открытым заголовкам нашего модуля. Но нам не нужно “импортировать” или ссылаться на них.

PrivateIncludePathModuleNames
Список имен модулей (путь не требуется) с заголовочными файлами. К которым требуется доступ к файлам частного кода нашего модуля. Но нам не нужно “импортировать” или ссылаться на них.*

Вопрос 1 ) “*не нужно “импортировать” или ссылаться на” *Это не имеет смысла. Я спрашивал других разработчиков c++ без каких-либо нереальных знаний. И они тоже были сбиты с толку. Что бы я хотел сделать с модулем, кроме импорта или ссылки на него? Что же тогда я должен сюда включить?

Вопрос 2) Почему на каждом из них написано “публичные заголовки” и “частный код”. Это очень тонко, но важно. Означает ли это, что cpp должен быть приватным, а заголовки публичными в моем плагине, например? (Я уверен. Что это не так. Потому что вы можете поместить любой файл куда угодно. И я видел его везде).

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


А теперь об этих двух:

*PublicDependencyModuleNames
Список имен общедоступных модулей зависимостей (путь не требуется) (автоматически включает private/public). Это модули. Которые требуются для наших общедоступных исходных файлов.

PrivateDependencyModuleNames
Список имен частных модулей зависимостей. Это модули, от которых зависит наш частный код, но ничто в наших общедоступных файлах включения не зависит.*

Вопрос 4 ) Это “иждивенчество”, а остальные “включенность”.

Как я понимаю, Include означает заголовки. Что же это такое? Что означает “зависимость” в Нереальных терминах?. Разве я не хотел бы использовать их, включая их?

Вопрос 5 ) В тексте документа private list не упоминается “no path needed” и “automatically does the private/public include”. Должен ли я учитывать его из другого аналогичного списка ( в этом случае он должен быть упомянут. И я сообщу им об этом ) или нет?.

Вопрос 6 ) Почему он говорит: “включает ли частное/публичное”?. Если вы добавите модуль в публичный список, то все частные и публичные открытые функции будут доступны?

Разве личное содержание не должно быть скрыто?. Что значит “включить”? Разве это не просто зависимость?


Вопрос 7 ) Итак, в моем случае у меня есть плагин с двумя модулями. У обоих есть несколько файлов в подпапках внутри public и private/ folders, а также больше подпапок.
Если я хочу, чтобы модуль A использовал модуль B, я помещаю заголовочные файлы, которые понадобятся A от B. В его общую папку.
Поэтому мне нужно включить ModuleA в какую переменную? Включить? Зависимость? и то и другое? публичное или частное? Я полагаю, что private не должен быть доступен. Поэтому я вынужден поместить все заголовки в общедоступный доступ, верно?.

После того, как я все это пойму, я, вероятно, четко запишу это для всех на вики-странице.

  1. Если вам просто нужен доступ к некоторым типам только заголовков (например, к библиотекам шаблонов). То вам нужен набор путей включения. Но не нужно связывать. Таким образом, вы добавляете модуль здесь вместо Public/PrivateDependencyModuleNames. Так как последний создает жесткую зависимость. Этот вариант использования редко встречается в UE4. Однако вы также будете использовать их, когда у вас есть динамические зависимости — многие модули редактора, в частности. Предоставляют интерфейс. Который позволяет использовать функциональность без статической привязки.

    В этих случаях вы добавляете имя модуля в один из этих двух списков, а также в список DynamicallyLoadedModuleNames.

  2. Файлы Cpp всегда должны быть конфиденциальными. Заголовки могут быть как общедоступными, так и закрытыми; они становятся общедоступными. Если другие модули могут нуждаться в их включении. В противном случае. Если они являются только внутренними. Поместите их в закрытое состояние. Обратите внимание, что заголовки в вашей общей папке никогда не должны включать заголовки из Личной папки.

  3. Не уверен на 100%, но я подозреваю. Что добавление модуля в публичный список также неявно делает его доступным из частного кода. Я не помню, чтобы мне когда-либо приходилось добавлять одну и ту же запись в оба списка.

  4. Эти списки в основном являются более сильными версиями — модули в них неявно добавляют свои пути включения. Но они также являются статически связанными зависимостями. Если вы хотите напрямую использовать типы, которые они предоставляют (кроме интерфейсов и только заголовочных типов). То они должны входить в эти списки. А не в списки IncludePath.

    Так что в большинстве случаев вы будете использовать именно их.

  5. Я предполагаю, что “путь не нужен” означает, что когда вы добавляете запись в список, вы добавляете только имя. В таком случае, да, это относится ко всем спискам. Фраза “автоматически включает в себя частное/публичное” не имеет для меня особого смысла. Но в основном, добавляя зависимость, он также настраивает пути включения; но только к открытым заголовкам модуля. Это точно то же самое для Частного списка; выбирая Закрытый список, вы в основном говорите. Что будете включать только заголовки из этого модуля в свой собственный закрытый код. Поэтому пути зависимости/включения не нужно распространять на другие модули. Которые могут добавить ваш модуль в свои списки.

    Да, это сбивает с толку.

  6. См.выше. Да, Частное никогда не раскрывается.

  7. Да, положите их куда-нибудь в общую папку Б. Скорее всего, вам нужен прямой доступ к типам. И в этом случае вам нужна статическая зависимость. Таким образом, вы добавляете “ModuleB” в список Public/PrivateDependencyModuleNames ModuleA. Всегда предпочитайте Private по умолчанию, чтобы уменьшить распространяющиеся зависимости. Но если вы знаете, что вам нужно будет включить некоторые заголовки B из некоторых общедоступных заголовков A. То зависимость должна быть Общедоступной; в противном случае. Когда кто-то другой придет. Чтобы добавить зависимость от A. Они могут столкнуться с ошибками включения.

    Конечно, если вы никогда не собираетесь, чтобы кто-то имел зависимость от A, то ему даже не нужно иметь общую папку. И вы всегда можете использовать Частные списки в его файле Build.cs.

Большое спасибо за ваше время, @kamrann . Я знаю, что это был длинный пост.

  1. “В этих случаях вы добавляете имя модуля в один из этих двух списков, а также в список DynamicallyLoadedModuleNames”.

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

  2. “заголовки в вашей общей папке никогда не должны включать заголовки из Личной папки.” — Ой. Действительно?: Тогда мне придется перенести каждый заголовок на публику… Я думаю. Что именно поэтому у меня есть эта ошибка компиляции.

  3. “также неявно делает его доступным из частного кода”.

  4. “пути dependency/include не нужно распространять на другие модули. Которые могут добавить ваш модуль в свои списки.

    Да, это сбивает с толку.” ← Ой… Может быть, причина в этом. Определенно нуждается в лучшем объяснении. Вы не знаете. Есть ли уже какая-нибудь вики-страница об этом? Я думаю. Что мы должны написать более длинную документацию для файла сборки, по крайней мере для этих списков.

  5. “ему даже не нужно иметь общую папку. И вы всегда можете использовать Частные списки в его файле Build.cs”. О, это очень хорошо. Я не думаю. Что кому-то вообще понадобится модуль редактора. Хорошо!

​​​​​​​Большое спасибо. теперь все стало яснее.