Здравствуйте, AeroSun, Вы писали:
AS>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Хедер — это некая внутренняя компиляторная сущность неизвестной природы, обозначаемая своим идентификатором. Использование идентификатора этой сущности в `#include <...>` приводит к замене данной директивы на содержимое хедера.
AS>Да нет же.
Я уже закрыл эту тему выше.
AS>Всё там известно и ясно любому
"Всё там известно и ясно любому" [x]
Мои ответы предназначены не для "любых", а для тех, кто хочет разбираться в тонкостях С и С++ ультравысоком уровне.
AS>кто хоть немного программировал на С++.
Это весьма характерный менталитет для "хоть немного программировавших на С++". Прямо по Дэннингу-Крюгеру. Надеюсь, что когда они побольше "попрограммируют на С++", понимания прибавится, убежденности поуменьшится.
Здравствуйте, AeroSun, Вы писали:
AS>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>За использование голого `#pragma once` — без страховки через include guards — "библиотека с гитхаба" сразу идет ффтопку под взрывы гомерического смеха окружающих. Никому такая библиотека не нужна.
AS> AS>`#pragma once` — это сейчас стандарт де-факто, include guards уже на полпути на свалку истории (вычищаются понемногу из легаси, ибо удобнее и есть уникумы которые умудряются разводить срач о code style как их "правильно" именовать :facepalm. AS>Де-факто с++ поддерживает это (вся тройка компиляторов уже хрен знает сколько времени, а кто пользуется допотопными — это их личный выбор и личные проблемы, которые остальных не касаются)
Смех да и только. Никто и нигде не пользуется `#pragma once`, кроме зеленых пионэров, которые изначально скопипастили ее из методичики какого-то своего ПТУ. Но и они быстро избавляются от этой привычки. "Де факто"...
АТ>>Многие из них, возможно, даже в курсе, что `#pragma once` ничего не дает (по сравнению с include guards), но продолжают механически следовать карго-культу.
AS>Прагма даёт лаконичность, отсутствие необходимости думать как гварды называть + отсутствие срачей о их "правильном" именовании. Взамен этого гварды как раз ничего не дают — они и есть самый явный карго-культ
Еще раз: даже те, кто продолжает карго-культово копипастить `#pragma once` из файла в файл, делают это всегда в совокупности с include guards. Голая `#pragma once` — это сразу штамп "пионэрский овнокот" поверх репозитория. Рассказывать же участникам форума про обилие "пионэрскиого овнокота" на гитхабе не обязательно — все об этом и так знают.
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>... Голая `#pragma once` — это сразу штамп "пионэрский овнокот" поверх репозитория.
VF>А нету ли у Вас еще таких правил для штампов? Вроде TAB vs spaces? Curly brace placement?
Ой, да их тыщи! (спасибо за ваш хороший вопрос)
Но я не записываю, поэтому приведу лишь те карго-культы, что сразу приходят в голову, ибо встречаются с удивительным постоянством и выраженной сезонностью (читай: каждый год очередному набору "пионэров" раздают все те же методички):
1. Царь всех карго-культов: явное приведение типа на результат `malloc` в С коде
2. Указательная арифметика вместо <stdarg.h> (львовский политех, согласно расследованию ruSO)
3. Золотой фонд индийского программирования: формат `%[]s` в scanf
4. `int i = 0; for (i; i < 10; ++i)`
5. Когда нужно увеличить размер динамического массива, копирование данных из старого массива в новый почему-то делается через третий, специально выделенный временный массив.
6. Чтение файла `while (!f.eof()) { ... }` — "нас так учили"
7. ...
Здравствуйте, Shtole, Вы писали:
S>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>карго-культы
S>Какой смысл вкладывается в словосочетание?
Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>>карго-культы
S>>Какой смысл вкладывается в словосочетание?
АТ>Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".
Традиционный смысл немного другой: вы построили самолёт из земли, а он не полетел. А вот если он вдруг взял и полетел, то это уже не карго-культ, а рабочая авиационная система, даже если вам не нравится эффективность/эстетика/что-то ещё.
Здравствуйте, Shtole, Вы писали:
S>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>>>карго-культы
S>>>Какой смысл вкладывается в словосочетание?
АТ>>Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".
S>Традиционный смысл немного другой: вы построили самолёт из земли, а он не полетел. А вот если он вдруг взял и полетел, то это уже не карго-культ, а рабочая авиационная система, даже если вам не нравится эффективность/эстетика/что-то ещё.
Это какой-то уж очень узкоспециализированный смысл.
Карго-культ — бесполезное и бессмысленное копирование/подражание во всех их проявлениях.
Полетел или не полетел самолет — никакого значения не имеет. А вот обязательное закидывание резиновой галоши в нишу левого шасси (потому что у оригинала в левой нише тоже валялась кем-то забытая галоша) — это уже карго-культ.
это как про того суслика
которого никто не видит
а он есть
pragma once уже поддерживается всеми мажорными компилями
но в стандарте нет
и это один из аргументов противников ее использования
мол зачем юзать то чего нет
сегодня оно есть
а завтра его нет
У>Ну, когда компилятор видит подключение файла, он может проверить, не подключался ли он уже. Но, конечно, надо пробежаться по всем инклуд путям, чтобы сформировать полное имя файла. Но это наверное кешируется как-то
Так делать нельзя, так как define'ы могли поменяться в результате включения этого или других файлов. Можно даже подсчитать (в разумных пределах) число раз включения файла:
#ifdef FILE_INCLUDE_COUNT_5
#error"The include limit for this file has been reached"#endif
#ifdef FILE_INCLUDE_COUNT_4
#define FILE_INCLUDE_COUNT_5 1
#else
#ifdef FILE_INCLUDE_COUNT_3
#define FILE_INCLUDE_COUNT_4 1
#else
#ifdef FILE_INCLUDE_COUNT_2
#define FILE_INCLUDE_COUNT_3 1
#else
#ifdef FILE_INCLUDE_COUNT_1
#define FILE_INCLUDE_COUNT_2 1
#else
#define FILE_INCLUDE_COUNT_1 1
#endif
Понятно, что если подумать, то можно сделать красивше, но — нет, не надо так делать.
Здравствуйте, reversecode, Вы писали:
R>не смотря на то что писанины с pragma once меньше R>нарваться на проблемы с одинаковыми файлами по разным путям — больше R>останусь на старом добром ifndef
Нарваться на одинаковые файлы по разным путям — эээ, а привести свой проект в нормальное состояние никак нельзя?
Если там по-настоящему одинаковые файлы (одни и те же сырцы зачем-то скопированы, или же одну внешнюю библиотеку ссылками раскидали по подпроектам, причём в публичных их частях) — то... один раз причесать, чтобы такого не было.
Выделить эти сырцы в отдельный подпроект, положить в отдельное место, настроить пути к нему.
Если же там одноимённые файлы с разным содержимым (разные версии одной библиотеке раскидали по подпроектам), то добро пожаловать в волшебный мир нарушения ODR.
И он покажет своё волшебство и с прагмой, и с ифдефом, только по-разному.
Я вот что-то не верю, что при выпуске каждой новой версии библиотеки авторы заморачиваются и обновляют все уникальные детальки всех инклуд-гардов.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>`#pragma once` не выжила
"отучаемся говорить за всех"
AT> именно именно потому, что в %99.9 случаев использование include guards является тотальным по отношению к включаемому файлу, то есть полностью функционально эквивалентным `#pragma once`. Такое использование include guards легко распознается препроцессором, который в такой ситуации не будет делать никакого "повторного открытия" и ничего препроцессировать заново не будет.
АТ>Другими словами, если препроцессор в состоянии реализовать предполагаемую функциональность `#pragma once`, то он в состоянии реализовать все это и без `#pragma once`- на основе умной обработки include guards. Именно потому от `#pragma once` и отказались.
В состоянии распознать и распознаёт — это две большие разницы.
Препроцессор, вообще-то, штука очень тупая.
Конечно, можно обмазать его эвристиками, вида "если встретил ifdef-define-.....-endif-EOF" — то считать это прагмой ванс и больше никогда не включать этот файл.
В таком случае, несрабатывание эвристики приведёт к дефолтному поведению.