Массив переменной длины, сложенный в постоянный массив

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];
Другие вопросы по тегам