Вопрос

От msdn Я понимаю это:

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top