Экономьте время отладки, переключившись на #pragma один раз

Если вы работали с C или C++ какое-то незначительное количество времени, вы, вероятно, сталкивались с «ошибкой: переопределение…»

Чтобы избежать этого, разработчики часто добавляют защиту включения, чтобы предотвратить многократное импортирование файлов заголовков в один файл. Например, в dog.h:

#ifndef DOG_H
#define DOG_H
// Contents of header file
#endif // DOG_H

Это предотвращает многие проблемы. В то же время он может быть грязным.

Вы можете столкнуться с поиском ошибок из-за отсутствия одной из трех строк. Чаще вы будете преследовать ошибки из-за копирования кода и забывания переименовать переменную заголовка. Если бы только существовал способ предотвратить эти и другие ошибки с помощью более простого в обслуживании и более эффективного кода…

Представляемдирективу препроцессора #pragma Once. Сравните это с предыдущим кодом dog.h:

#pragma once
// Contents of header file

#Pragma Once обрабатывается препроцессором, что предотвращает ошибку программиста. Хотя он поддерживается GCC, Clang и наиболее популярными компиляторами C/C++, он не является частью стандарта C++.

В зависимости от вашей кодовой базы это может вызвать проблемы с переносимостью, если компилятор не указан. Тем не менее, основным основным компилятором, не поддерживающим его в настоящее время, является IAR C/C++, поэтому он широко поддерживается.

В дополнение к уменьшению количества ошибок, #pragma Once обычно оптимизируется для сокращения использования препроцессора и открытия файлов, что делает его быстрее, чем включение защиты. Обратите внимание, что многие компиляторы уже оптимизированы для этого, поэтому возможно, что они одинаково быстры.

Одним из пограничных случаев использования #pragma Once является наличие несколько файлов заголовков с одинаковым именем. Поскольку эта директива препроцессора не является частью стандарта, каждый компилятор обрабатывает ее по-своему.

Как правило, это делается путем просмотра имени файла, содержимого и временной метки. Если вы планируете использовать dog.h в нескольких папках вашего проекта, может быть лучше использовать включаемые охранники. Особенно если в процессе сборки есть повторяющийся файл (имя и содержимое), поведение #pragma Once может быть непредсказуемым.

Подводя итог, можно сказать, что замена защиты включения на #pragma Once может стать отличным способом уменьшить количество ошибок программиста, улучшить читаемость и увеличить скорость компиляции. При этом помните о крайних случаях дублирования имен файлов и целевых компиляторов.

Попробуйте! Посмотрите, как однократное переключение на #pragma очищает ваш код.