可变长度数组折叠为常数数组

时间:2013-08-26 01:05:58

标签: c constantfolding

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 个答案:

答案 0 :(得分:8)

在C中,const int变量是一个变量(碰巧是const - 限定的),而不是在全局和静态数组的边界中使用时所需的整数常量,或者在case语句的switch标签中。有关详细讨论,请参阅static const vs #define in 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语句和数组边界中使用。

答案 1 :(得分:4)

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

替换第二个声明
char buf[256];

应该解决问题。

您可能希望将buf_length替换为#define

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