Смущен «#pragma GCC Diagnostic Push / Pop»

Я пытаюсь использовать «#pragma GCC Diagnostic Push» и «#pragma GCC Diagnost Pop», чтобы включить предупреждения для моего кода, а затем снова отключить (например, после окончания заголовка). Но предупреждения не отключаются, как ожидалось, когда я выскочил. Как простой пример этого:

int main(int, char*[]) {
int i;
unsigned int ui;
i==ui;  // no warning as expected
// this push doesn't make any difference
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wsign-compare"i==ui;  // warns as expected

// this push doesn't make any difference in warning output
#pragma GCC diagnostic push

#pragma GCC diagnostic ignored "-Wsign-compare"i==ui; // no warning as expected

#pragma GCC diagnostic pop
i==ui; // warns as expected

#pragma GCC diagnostic pop
i==ui; // warns unexpectedly

// I can put as many pops as I want here, nothing changes
#pragma GCC diagnostic pop
i==ui; // warns unexpected
return 0;
}

С gcc 4.6 (и 4.7) и без включенных предупреждений из командной строки (или даже переданных в командной строке -Wno-sign-Compare) предупреждения отображаются в тексте. То есть, похоже, что никто не может вернуть вещи обратно к значениям командной строки. Я неправильно понимаю, как это должно работать?

Любые указатели о том, как заставить вещи работать?

Я вижу то же поведение с примером из руководства gcc:

int test() {
int a,b,c,d;
#pragma GCC diagnostic warning "-Wuninitialized"foo(a);                  /* warning is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"foo(b);                  /* no diagnostic for this one */
#pragma GCC diagnostic pop
foo(c);                  /* warning is given for this one */
#pragma GCC diagnostic pop
foo(d);                  /* warning is given here too, for some reason */
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]