Массив переменной длины, сложенный в постоянный массив
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 );
Это предупреждение:
массив переменной длины, сложенный в постоянный массив как расширение.
Вы можете помочь решить это?
2 ответа
В С const int
переменная является переменной (это случается const
), а не целочисленная константа, которая требуется при использовании в границах глобальных и статических массивов или в case
ярлыки switch
заявление. Увидеть static const
против #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
операторы и границы массивов.
buf_length + 1
не обрабатывается как постоянное выражение времени компиляции.
Замена второго объявления
char buf[256];
должен решить проблему.
Вы можете заменить buf_length
с #define
:
#define BUF_LENGTH 255
char buf[BUF_LENGTH + 1];