Я пытаюсь использовать «#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 */
}
Задача ещё не решена.
Других решений пока нет …