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 );
Run Code Online (Sandbox Code Playgroud)
这得到警告:
可变长度数组折叠为常量数组作为扩展名.
你能帮忙解决这个问题吗?
在C中,const int
变量是变量(恰好是const
限定的),而不是在全局和静态数组的边界中或在语句的case
标签中使用时所需的整数常量switch
.有关广泛讨论,请参阅C中的static const
vs.#define
我假设您知道什么是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));
Run Code Online (Sandbox Code Playgroud)
注意我改变了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];
Run Code Online (Sandbox Code Playgroud)
应该解决问题。
您可能想要替换buf_length
为#define
:
#define BUF_LENGTH 255
char buf[BUF_LENGTH + 1];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1450 次 |
最近记录: |