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


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 5

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 и границах массива.

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

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

char buf[256];

Следует устранить проблему.

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

#define BUF_LENGTH 255
char buf[BUF_LENGTH + 1];