有没有办法警告或禁止文字字符串连接,例如:
const char *a = "foo" " bar";
我花了几个小时在一个大的静态数组中找到一个错误
const char * a[] = {"foo" "bar"};
代替
const char * a[] = {"foo", "bar"};
Clang 有一个警告 -Wstring-concatenation 明确设计用于捕获此类错误:
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"};
但是当你在一个数组中有大量的初始化器并且只在几个地方打错字时,这似乎是理想的。
这是一个demo.
GCC 似乎没有相应的警告,但有一个 request 添加它。
请注意,这仅适用于数组初始化。你的例子
const char *x = "foo" " bar";
不会被这个警告(或我知道的任何其他警告)检测到。
另请注意,启用此警告可能会产生很多误报,但您可以在尝试捕获错误时谨慎使用它。
不是真的。字符串文字连接是 C/C++ 语法中不可或缺的一部分,并且有很多用例。因此需要某种努力,这可能会破坏发现错误的目标。
然而,字符串连接非常严格地对两个字符串字面量相继出现,中间只有空格,所以打断空格会导致错误。例如,在这种情况下你可以这样写:
const *char[] = {("foo") ("bar")}; // Error
这会导致错误,而预期的陈述不会:
const *char[] = {("foo"), ("bar")}; // OK
所以,简而言之,您无法通过某种方式明确地告诉编译器两个字符串文字可能会被连接并且在所有其他情况下都会失败,因此您必须明确地告诉编译器何时字符串文字可能 not串联。