массив переменной длины свернут в массив констант

const int buf_length = 255;
char buf[ buf_length + 1 ];

snprintf(buf, buf_length, "%d Next on [%s] %s:", channel, station_channel(channel), station_name(channel));

strncat(buf, "(", buf_length - strlen (buf));
strncat(buf, station_country( xmltv ), buf_length - strlen(buf));
strncat(buf, ")", buf_length - strlen (buf));

country_list_set_text( buf );

Это предупреждение:

массив переменной длины свернут в постоянный массив в качестве расширения.

Можете ли вы помочь решить эту проблему?


person user1840007    schedule 26.08.2013    source источник


Ответы (2)


В C переменная const int — это переменная (которая имеет const квалификацию), а не целочисленная константа, которая требуется при использовании в границах глобальных и статических массивов или в метках case оператора switch. Подробное обсуждение см. в разделе static const vs #define в C. Я предполагаю, что вы знаете, что такое VLA (массив переменной длины) — если нет, прокомментируйте, и я добавлю разъяснения.

Есть несколько способов обойти это. Я обычно использую enum:

enum { buf_length = 255 };
char buf[buf_length + 1];

snprintf(buf, sizeof(buf), "%d Next on [%s] %s:",
         channel, station_channel(channel), station_name(channel));

Обратите внимание, что я изменил использование buf_length в вызове snprintf() на sizeof(buf); это канонический способ сделать это, когда объявление массива находится в области видимости, и позволяет избежать потери лишнего байта, который вы добавили в буфер.

Вы можете использовать #define buf_length 255; это классический способ сделать это.

Я часто использовал константу в верхнем регистре (BUF_LENGTH), а не в нижнем регистре для обозначения константы. На самом деле это не критично, но более или менее общепринято в C (например, большинство констант в стандарте C, со странными исключениями, такими как L_tmpnam).

В C++ история другая. const int buf_length = 255; можно использовать в операторах switch и границах массива.

person Jonathan Leffler    schedule 26.08.2013

buf_length + 1 не рассматривается как константное выражение времени компиляции.

Замена второго объявления на

char buf[256];

должен решить проблему.

Вы можете заменить buf_length на #define:

#define BUF_LENGTH 255
char buf[BUF_LENGTH + 1];
person Sergey Kalinichenko    schedule 26.08.2013