C++ прагма GCC system_header директива
Что делает эта директива C++: "#pragma GCC system_header"?
2 ответа
Я погуглил и получил это:
#pragma GCC system_header
This pragma takes no arguments. It causes the rest of the code in the current file to be treated as if it came from a system header. Section 2.7 System Headers.
Подробнее о системных заголовках
2,7. Системные Заголовки
Заголовочные файлы, объявляющие интерфейсы к операционной системе и библиотекам времени выполнения, часто не могут быть записаны в строго соответствующем C. Следовательно, GCC придает коду, найденному в системных заголовках, специальную обработку. Все предупреждения, кроме предупреждений, генерируемых #warning (Глава 5 Диагностика), подавляются, пока GCC обрабатывает системный заголовок. Макросы, определенные в системном заголовке, невосприимчивы к нескольким предупреждениям, где бы они ни были развернуты. Этот иммунитет предоставляется на специальной основе, когда мы обнаруживаем, что предупреждение генерирует много ложных срабатываний из-за кода в макросах, определенных в системных заголовках.
Обычно только заголовки, найденные в определенных каталогах, считаются системными заголовками. Эти каталоги определяются при компиляции GCC. Однако есть два способа сделать нормальные заголовки системными заголовками.
Опция командной строки -isystem добавляет свой аргумент в список каталогов для поиска заголовков, как -I. Любые заголовки, найденные в этом каталоге, будут считаться системными заголовками.
Все каталоги с именем -isystem ищутся после всех каталогов с именем -I, независимо от их порядка в командной строке. Если один и тот же каталог назван и -I, и -isystem, опция -I игнорируется. GCC выдает информационное сообщение, когда это происходит, если используется -v.
Существует также директива #pragma GCC system_header, которая указывает GCC рассматривать остальную часть текущего включаемого файла как системный заголовок, независимо от того, где он был найден. Код, который идет перед #pragma в файле, не будет затронут. #pragma GCC system_header не влияет на первичный исходный файл.
В очень старых системах некоторые из предопределенных каталогов системных заголовков получают еще более особый подход. GNU C++ считает код в заголовках, найденных в этих каталогах, окруженным внешним блоком "C". Нет способа запросить это поведение с
#pragma
или из командной строки.
Это говорит о том, что все, что прошло после этого, обрабатывается так, как если бы оно было в системном заголовке Это означает, что все предупреждения, кроме #warning, подавляются