массив переменной длины, сложенный в постоянный массив
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 ответа:
В языке 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
и границах массива.