2016-09-15 1 views
5

Этот простой код:как отключить эту частности Предупреждение

#define WIDTH 500.5 
#define NB 23.2 

int x[(int)(WIDTH/NB)]; 

дает мне предупреждение:

prog.c:4:1: warning: variably modified 'x' at file scope [enabled by default] 

Если я поставил #define WIDTH 500 и #define NB 23, предупреждение исчезает.

Передача значения поплавка для WIDTH макроэкономической оценки компилятором и, таким образом, выдает предупреждение, потому что массив не имеет постоянного размера.

препроцессированный код C выглядит int x[(int)(500.5/23.2)];, в то время как int x[(int)(500/23)]; ОК для компилятора (значение уже постоянное число)

Я хотел бы найти способ либо

  • игнорировать это особое предупреждение (но оставляя другие, так что я могу позволить -Werror: кажется, что это безнадежное дело:. GCC, C: Finding out name of default warnings for use in #pragma ignore
  • исправить код, чтобы он делает то, что я хочу, не выдающего предупреждения
  • сила предварительно процессор для выполнения вычислений в виде целого числа

Забавная вещь: компиляция с g++ я не имею предупреждение в то время как я прочитал здесь, что массивы переменной длины официально не поддерживаются в C++, только в C99. Но это не вариант для меня, так как мне нужно придерживаться С.

+1

препроцессор не делает расчет на 500/23 - его компилятор задача – Serge

+0

да, видно после, но это работает. Компилятор видит, что это целая константа. С поплавками, даже отлитые в целые числа, это не так. –

+0

Как и вопрос. Но не вижу возможности принудительно вводить значение с плавающей запятой в целое число во время компиляции, потому что вы пытаетесь работать с неявным преобразованием типа C. Я думаю, что путь был бы окружен этим кодом с помощью «#pragma GCC diagnostic» или любого другого эквивалента вашего компилятора. – tofro

ответ

3

Это просто нарушает стандарт:

Integer постоянного выражение

Целое константы является выражением, состоит только из операторов, отличных от присваивания, прирост, декремент, функция-вызов или запятая, за исключением того, что литые операторы могут использовать только арифметические типы для целочисленных типов, integer константы, константы перечисления, cha racter константы, плавающие константы, но только если они немедленно используются в качестве операндов слепков для целого типа

И далее:

Следующие контексты требуют выражения, которые известны как целое постоянные выражения:

...

  • Индекс в массиве целеуказателем (с C99)
+0

Рекомендовать либо добавить цитату, либо/или использовать стандарт C11, который немного отличается. – chux

1

Вот один пример из GNU GCC, которые могут помочь вам:

#pragma GCC diagnostic error "-Wuninitialized" 
    foo(a);      /* error 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);      /* error is given for this one */ 
    #pragma GCC diagnostic pop 
    foo(d);      /* depends on command-line options */ 
+0

Хорошо, но в моем конкретном случае, что бы было ключевое слово: '#pragma GCC diagnostic ignored '-Wsomething ???" int x [(int) (WIDTH/NB)]; #pragma GCC диагностический поп', поскольку нет указаний о том, как подавлять предупреждение в предупреждении сам? –

+0

Здесь приведен полный список опций, которые вы можете использовать: [gcc-list] (https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html). Я полагаю, что вам понадобятся все следующие опции: ** - Wconversion **, ** - Wformat ** и ** - Wtraditional **. Проверьте прилагаемый список. – acornagl

+0

так много для этого: http://stackoverflow.com/questions/ 15997634/gcc-c-find-out-name-of-default-warnings-for-use-in-pragma-ignore –

 Смежные вопросы

  • Нет связанных вопросов^_^