C #: Требуется ли восстановление прагма-предупреждения? - PullRequest
39 голосов
/ 17 февраля 2009

С MSDN Я получаю это:

#pragma warning disable warning-list
#pragma warning restore warning-list

В примерах используются disable и restore. Нужно ли restore, если я хочу отключить его для всего файла?

Например, если я не восстановлю, как далеко это унесет? Предупреждения отключены для всего, что скомпилировано после этого? Или только для остальной части этого файла? Или это игнорируется?

Ответы [ 3 ]

44 голосов
/ 17 февраля 2009

Если вы не восстанавливаете, отключение активно для оставшейся части файла.

Интересно, что это не определено в спецификации языка . (см. раздел 9.5.8) Однако в разделе 9.5.1, посвященном условным символам компиляции, это действительно указывается «до конца поведения файла»

Символ остается определенным до Директива #undef для того же символа обрабатывается, или до конца исходный файл достигнут.

Учитывая, что «препроцессор» фактически является частью фазы лексического анализа компиляции, вполне вероятно, что это поведение является эффективным контрактом для Microsoft и всех других реализаций в обозримом будущем (тем более что альтернативный вариант будет чрезвычайно сложным и недетерминированный на основе порядка компиляции исходного файла)

3 голосов
/ 17 февраля 2009

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

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

Итак, лучшее использование для #pragma warning - это поставить «disable disable» прямо перед строкой, вызывающей предупреждение, которое я хочу подавить, и «restore warning» сразу после строки, так что такое же условие в другом Расположение в файле по-прежнему вызовет предупреждение.

2 голосов
/ 17 февраля 2009

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

#pragma warning disable 649
struct MyInteropThing
{
    int a;
    int b;
}
#pragma warning restore 649

В приведенном выше примере я отключил предупреждение CS00649, поскольку намереваюсь использовать эту структуру небезопасным образом. Компилятор не поймет, что я буду писать в память с таким макетом, поэтому я хочу игнорировать предупреждение:

Поле 'field' никогда не назначается и всегда будет иметь значение по умолчанию 'value'

Но я не хочу, чтобы весь файл не оставляли без проверки.

...