Подтвердить что ты не робот

Какова область действия директивы прагмы?

Какова область действия директивы pragma? Например, если я скажу #pragma warning(disable: 4996) в заголовочном файле A, который включен из другого файла B, это также отключит все эти предупреждения внутри B? Или мне нужно снова включить предупреждение в конце файла A?

4b9b3361

Ответ 1

Это до конца единицы перевода. Неформально TU является исходным файлом с его включенными файлами.

Обычным шаблоном является следующее:

#pragma warning (push) //save
#pragma warning (disable: xxxx)
#pragma warning (disable: yyyy)
...

//code

#pragma warning (pop) //restore prev settings

например

//A.h
#pragma once
#pragma warning (disable: 1234)
#include "b.h"

//b.h
#pragma once
//when included after a.h 1234 will be disabled

//c.cpp
#include "a.h" //warnings 1234 from b.h is disabled

//d.cpp
#include "b.h" //warnings 1234 from b.h are not disabled
#include "a.h"

Ответ 2

Pragmas специфичны для используемого компилятора и платформы. Поэтому лучше всего посмотреть документацию компилятора.

Для компиляторов IBM, например:

Многие директивы прагмы могут быть указаны в любом в исходном коде в блок компиляции; другие должны быть указанных перед любыми другими директивами или исходных кодов. в индивидуальные описания для каждого прагма, раздел "Использование" описывает любые ограничения на прагму размещение.

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

Вы можете дополнительно ограничить объем приложение прагмы, используя взаимодополняющие пары прагмы директивы вокруг выбранного раздела кода. Например, используя #pragma опции источника и опции #pragma директивы nosource следующим образом требует, чтобы только выбранные части вашего исходного кода должны быть включены в ваш список компиляторов:

#pragma options source 

/*  Source code between the source and nosource pragma
    options is included in the compiler listing                */

#pragma options nosource

Многие прагмы предоставляют "поп" или "reset", suboptions, которые позволяют вам включить и отключите параметры прагмы в стековый метод; примеры этих приведены в соответствующей прагме описание.

Как правило, прагма должна иметь эффект сразу после ее объявления, независимо от того, какой заголовок он набирает, до конца единицы перевода. Однако есть некоторые прагмы, которые влияют на всю программу. Например, ориентированная на Microsoft "правая ссылка" ссылка ", которая добавляет зависимость от некоторой библиотеки к модулю перевода и всем его" пользователям ".

Ответ 3

Да, он также отключит предупреждения внутри B.

Модуль перевода - это .cpp файл, и все его включенные файлы расширены в один большой большой файл. Эта прагма продлится до конца единицы перевода или пока другое предупреждение #pragma не изменит настройку. Или, если вы компилятор поддерживает #pragma push и #pragma pop, он будет длиться до следующего #pragma pop.

'# pragma push' и '#pragma pop' позволяют создавать области. Предупреждения #pragma в пределах такой области применения будут применяться к концу области.