Информация об изменениях

Сообщение Re[3]: include guards от 10.01.2022 7:55

Изменено 10.01.2022 8:04 YuriV

Re[3]: include guards
Здравствуйте, reversecode, Вы писали:


М>>А что не так с прагма уанс, можно вкратце, и почему это секта?


R>/somedir1/header_file.h

R>/somedir2/header_file.h

R>два хидеры с разным содержанием но одинаковым именем

R>включенные в один модуль
R>считается что при прагма онце будут проблемы

Нет, проблема как раз противоположная. Когда один и тот же файл лежит и включается из разных мест (да такое бывает в реальных проектах) и тогда в случае прагмы эти файлы будут считаться разными и естественно каждый раз включаться заново. А в твоём случае не поможет и ifdef имя_файла. При первом включении header_file.h в таблицу макросов препроцессора будет внесено значение header_file_h и следующие включение header_file.h будет скипнуто. В этом случае как раз и поможет прагма Так что если не знаешь структуры проекта более безопасно писать прагму, но если всё контролируешь, то конечно старый добрый ifdef. Единственный минус ifdef он засирает таблицу макросов ненужной шелухой, но как ты показал сам удар по производительности компиляции незначителен, что в общем не удивительно.
Re[3]: include guards
Здравствуйте, reversecode, Вы писали:


М>>А что не так с прагма уанс, можно вкратце, и почему это секта?


R>/somedir1/header_file.h

R>/somedir2/header_file.h

R>два хидеры с разным содержанием но одинаковым именем

R>включенные в один модуль
R>считается что при прагма онце будут проблемы

Нет, проблема как раз противоположная. Когда один и тот же файл лежит и включается из разных мест (да такое бывает в реальных проектах) и тогда в случае прагмы эти файлы будут считаться разными и естественно каждый раз включаться заново. А в твоём случае не поможет и ifndef header_file_h. При первом включении header_file.h в таблицу макросов препроцессора будет внесено значение header_file_h и последующие включения header_file.h будут скипнуты. В этом случае как раз и поможет прагма Так что если не знаешь структуры проекта более безопасно писать прагму, но если всё контролируешь, то, конечно, старый добрый ifndef. Единственный минус ifndef — он засирает таблицу макросов ненужной шелухой, но как ты показал сам удар по производительности компиляции незначителен, что в общем не удивительно.