warning: suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma? [-Wstring-concatenation]
char const *a[] = { "ok", "foo" "bar", "ok"};
^
,
这对你展示的玩具示例不完全有效,因为你需要有几个初始化器,并且只在几个地方缺少逗号,即:
// no warning
char const *b[] = {"foo" "bar"};
// no warning
char const *c[] = {"ok", "foo" "bar"};
// no warning
char const *d[] = {"foo" "bar", "ok"};
2条答案
按热度按时间kq4fsx7k1#
Clang有一个警告-Wstring-concatenation,它被显式地设计来捕获这样的bug:
这对你展示的玩具示例不完全有效,因为你需要有几个初始化器,并且只在几个地方缺少逗号,即:
但是当你在一个数组中有大量的初始化器,并且只在几个地方打错了,这似乎是理想的。
这里有一个demo。
GCC似乎没有类似的警告,但有一个request可以添加。
请注意,这只适用于数组初始化。你的例子
不会被这个警告(或我所知道的任何其他警告)检测到。
还要注意,启用此警告可能会产生大量误报,但在尝试捕获bug时可以谨慎使用它。
dced5bon2#
字符串文字连接是C/C++语法中不可或缺的一部分,有很多用例。因此,需要付出某种努力,这可能会挫败抓住错误的目标。
但是,字符串连接非常严格地适用于两个字符串字面值,它们之间只有白色,因此断开空白将导致错误。例如,在这种情况下,你可以写:
这将导致错误,而预期的语句不会:
所以,简而言之,你不能有某种方式显式地告诉编译器两个字符串可以连接,并且在所有其他情况下都失败,所以你必须显式地告诉编译器什么时候字符串可以 * 不 * 连接。