Какова область действия прагматической директивы? - PullRequest
19 голосов
/ 22 февраля 2011

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

Ответы [ 3 ]

18 голосов
/ 22 февраля 2011

До конца перевода.Неофициально, 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"
8 голосов
/ 22 февраля 2011

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

Для компиляторов 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

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

Как правило, прагма должна действовать сразу после ее объявления, независимо от того, из какого заголовка она идет, до конца единицы перевода. Тем не менее, есть некоторые прагмы, которые влияют на всю программу. Например, специфическая для Microsoft прагма «link», которая добавляет зависимость от какой-либо библиотеки в модуль перевода и всех его «пользователей».

1 голос
/ 22 февраля 2011

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

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

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

...