Re[11]: include guards
От: Андрей Тарасевич Беларусь  
Дата: 30.01.22 17:49
Оценка:
Здравствуйте, AeroSun, Вы писали:

AS>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Хедер — это некая внутренняя компиляторная сущность неизвестной природы, обозначаемая своим идентификатором. Использование идентификатора этой сущности в `#include <...>` приводит к замене данной директивы на содержимое хедера.


AS>Да нет же.


Я уже закрыл эту тему выше.

AS>Всё там известно и ясно любому


"Всё там известно и ясно любому" [x]

Мои ответы предназначены не для "любых", а для тех, кто хочет разбираться в тонкостях С и С++ ультравысоком уровне.

AS>кто хоть немного программировал на С++.


Это весьма характерный менталитет для "хоть немного программировавших на С++". Прямо по Дэннингу-Крюгеру. Надеюсь, что когда они побольше "попрограммируют на С++", понимания прибавится, убежденности поуменьшится.
Best regards,
Андрей Тарасевич
Отредактировано 30.01.2022 17:52 Андрей Тарасевич . Предыдущая версия .
Re[11]: Нужна ли защита от повторного включения
От: Андрей Тарасевич Беларусь  
Дата: 30.01.22 17:59
Оценка: -7 :)))
Здравствуйте, 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` — это сразу штамп "пионэрский овнокот" поверх репозитория. Рассказывать же участникам форума про обилие "пионэрскиого овнокота" на гитхабе не обязательно — все об этом и так знают.
Best regards,
Андрей Тарасевич
tide мем
От: Sm0ke Россия ksi
Дата: 02.02.22 15:00
Оценка:
Вы всё ещё используете #include ?
Тогда мы идём к вам!



Вот там уже никакие инклюд гварды будут не нужны.
Проблема что gcc have issues with them.
Wrong line numbers in errors. Etc.
Отредактировано 02.02.2022 15:02 Sm0ke . Предыдущая версия .
Re: tide мем
От: Sm0ke Россия ksi
Дата: 09.02.22 02:17
Оценка:
twi

Re[12]: Нужна ли защита от повторного включения
От: VladFein США  
Дата: 09.02.22 03:27
Оценка: +1
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>... Голая `#pragma once` — это сразу штамп "пионэрский овнокот" поверх репозитория.


А нету ли у Вас еще таких правил для штампов? Вроде TAB vs spaces? Curly brace placement?
Re[13]: Нужна ли защита от повторного включения
От: Андрей Тарасевич Беларусь  
Дата: 09.02.22 17:11
Оценка:
Здравствуйте, 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. ...
Best regards,
Андрей Тарасевич
Отредактировано 09.02.2022 17:35 Андрей Тарасевич . Предыдущая версия . Еще …
Отредактировано 09.02.2022 17:29 Андрей Тарасевич . Предыдущая версия .
Re[14]: Нужна ли защита от повторного включения
От: Shtole  
Дата: 09.02.22 17:31
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>карго-культы


Какой смысл вкладывается в словосочетание?

Земляные самолёты не летают, а упомянутые библиотеки были так мне нужны, что кушать не мог. Не говоря уж про написание программ в Студии.
Do you want to develop an app?
Re[15]: Нужна ли защита от повторного включения
От: Андрей Тарасевич Беларусь  
Дата: 09.02.22 18:40
Оценка:
Здравствуйте, Shtole, Вы писали:

S>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>карго-культы


S>Какой смысл вкладывается в словосочетание?


Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".
Best regards,
Андрей Тарасевич
Re[16]: Нужна ли защита от повторного включения
От: Shtole  
Дата: 09.02.22 19:01
Оценка: +1 :)
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>>>карго-культы


S>>Какой смысл вкладывается в словосочетание?


АТ>Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".


Традиционный смысл немного другой: вы построили самолёт из земли, а он не полетел. А вот если он вдруг взял и полетел, то это уже не карго-культ, а рабочая авиационная система, даже если вам не нравится эффективность/эстетика/что-то ещё.
Do you want to develop an app?
Re[17]: Нужна ли защита от повторного включения
От: Андрей Тарасевич Беларусь  
Дата: 09.02.22 19:20
Оценка:
Здравствуйте, Shtole, Вы писали:

S>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>>>карго-культы


S>>>Какой смысл вкладывается в словосочетание?


АТ>>Традиционный. Слепое следование/копирование некоей последовательности действий, без понимания ее семантики. Одним из наиболее распространённых вариантов карго-культа в программировании является выполнение ненужных (читай: ритуальных) действий в совокупности с нужными, сопровождаемое религиозными по своей сути опасениями вида "я не знаю, зачем я это делаю, но я всегда так делал ("нас так учили", "все так делают" и т.п.) и боюсь, что без этого все сломается".


S>Традиционный смысл немного другой: вы построили самолёт из земли, а он не полетел. А вот если он вдруг взял и полетел, то это уже не карго-культ, а рабочая авиационная система, даже если вам не нравится эффективность/эстетика/что-то ещё.


Это какой-то уж очень узкоспециализированный смысл.

Карго-культ — бесполезное и бессмысленное копирование/подражание во всех их проявлениях.

Полетел или не полетел самолет — никакого значения не имеет. А вот обязательное закидывание резиновой галоши в нишу левого шасси (потому что у оригинала в левой нише тоже валялась кем-то забытая галоша) — это уже карго-культ.
Best regards,
Андрей Тарасевич
Отредактировано 09.02.2022 19:27 Андрей Тарасевич . Предыдущая версия .
Re: include guards
От: reversecode google
Дата: 09.05.23 17:44
Оценка:
народ на реддите опять начал)))

https://old.reddit.com/r/cpp/comments/13bxunj/include_guards_and_their_optimizations/
https://github.com/IncludeGuardian/multiple-inclusion-optimization-tests
Re: include guards
От: Pzz Россия https://github.com/alexpevzner
Дата: 29.10.24 06:43
Оценка:
Здравствуйте, reversecode, Вы писали:

R>нарваться на проблемы с одинаковыми файлами по разным путям — больше

R>останусь на старом добром ifndef

А эта самая прагма ванс, она есть хоть в каком-то стандарте? Раньше она была расширением, свойственным мелкософтовским компиляторам...
Re[2]: include guards
От: Великий Реверс google
Дата: 29.10.24 11:56
Оценка:
это как про того суслика
которого никто не видит
а он есть

pragma once уже поддерживается всеми мажорными компилями
но в стандарте нет
и это один из аргументов противников ее использования
мол зачем юзать то чего нет
сегодня оно есть
а завтра его нет
Re[5]: Нужна ли защита от повторного включения
От: B0FEE664  
Дата: 31.10.24 11:08
Оценка:
Здравствуйте, удусекшл, Вы писали:


У>Ну, когда компилятор видит подключение файла, он может проверить, не подключался ли он уже. Но, конечно, надо пробежаться по всем инклуд путям, чтобы сформировать полное имя файла. Но это наверное кешируется как-то

Так делать нельзя, так как 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

Понятно, что если подумать, то можно сделать красивше, но — нет, не надо так делать.
И каждый день — без права на ошибку...
Re: include guards
От: Кодт Россия  
Дата: 05.11.24 15:09
Оценка:
Здравствуйте, reversecode, Вы писали:

R>не смотря на то что писанины с pragma once меньше

R>нарваться на проблемы с одинаковыми файлами по разным путям — больше
R>останусь на старом добром ifndef

Нарваться на одинаковые файлы по разным путям — эээ, а привести свой проект в нормальное состояние никак нельзя?

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

Если же там одноимённые файлы с разным содержимым (разные версии одной библиотеке раскидали по подпроектам), то добро пожаловать в волшебный мир нарушения ODR.
И он покажет своё волшебство и с прагмой, и с ифдефом, только по-разному.

Я вот что-то не верю, что при выпуске каждой новой версии библиотеки авторы заморачиваются и обновляют все уникальные детальки всех инклуд-гардов.
Перекуём баги на фичи!
Re[6]: Нужна ли защита от повторного включения
От: Кодт Россия  
Дата: 05.11.24 15:40
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>`#pragma once` не выжила


"отучаемся говорить за всех"

AT> именно именно потому, что в %99.9 случаев использование include guards является тотальным по отношению к включаемому файлу, то есть полностью функционально эквивалентным `#pragma once`. Такое использование include guards легко распознается препроцессором, который в такой ситуации не будет делать никакого "повторного открытия" и ничего препроцессировать заново не будет.


АТ>Другими словами, если препроцессор в состоянии реализовать предполагаемую функциональность `#pragma once`, то он в состоянии реализовать все это и без `#pragma once`- на основе умной обработки include guards. Именно потому от `#pragma once` и отказались.


В состоянии распознать и распознаёт — это две большие разницы.

Препроцессор, вообще-то, штука очень тупая.

Конечно, можно обмазать его эвристиками, вида "если встретил ifdef-define-.....-endif-EOF" — то считать это прагмой ванс и больше никогда не включать этот файл.
В таком случае, несрабатывание эвристики приведёт к дефолтному поведению.

Но что делать, если извне ломают эвристику?
// foo.h
#ifndef FOO_H
#define FOO_H

blablabla

#include "bar.h"

blablabla

#endif


// bar.h
#ifdef HACK
#undef FOO_H


// buz.cpp

#define HACK
#include "foo.h"

#undef HACK
#include "foo.h"

#undef FOO_H
#include "foo.h"


Аха, значит, надо не просто хранить множество ванс-файлов, но и табличку: ванс-файл => его дефайн.
И смотреть, что дефайн всё ещё включён.

И пошло, поехало...
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.