10
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 );

这会得到警告:

可变长度数组折叠成常量数组作为扩展。

你能帮忙解决这个问题吗?

4

2 回答 2

15

在 C 中,const int变量是一个变量(恰好是const- 限定的),而不是在全局和静态数组的边界或语句的case标签中使用时需要的整数常量。switch请参阅static constvs #definein 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语句和数组边界。

于 2013-08-26T01:19:49.217 回答
5

不被buf_length + 1视为编译时常量表达式。

将第二个声明替换为

char buf[256];

应该解决问题。

您可能想要替换buf_length#define

#define BUF_LENGTH 255
char buf[BUF_LENGTH + 1];
于 2013-08-26T01:11:48.377 回答