C/C++警告或禁止文字字符串连接

vlf7wbxs  于 2023-05-22  发布在  C/C++
关注(0)|答案(2)|浏览(261)

是否有方法警告或禁止文字字符串连接,例如:

const char *a = "foo" " bar";

我花了几个小时在一个大的静态数组中找到一个bug

const char * a[] = {"foo" "bar"};

而不是

const char * a[] = {"foo", "bar"};
kq4fsx7k

kq4fsx7k1#

Clang有一个警告-Wstring-concatenation,它被显式地设计来捕获这样的bug:

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";

不会被这个警告(或我所知道的任何其他警告)检测到。
还要注意,启用此警告可能会产生大量误报,但在尝试捕获bug时可以谨慎使用它。

dced5bon

dced5bon2#

字符串文字连接是C/C++语法中不可或缺的一部分,有很多用例。因此,需要付出某种努力,这可能会挫败抓住错误的目标。
但是,字符串连接非常严格地适用于两个字符串字面值,它们之间只有白色,因此断开空白将导致错误。例如,在这种情况下,你可以写:

const *char[] = {("foo") ("bar")};  // Error

这将导致错误,而预期的语句不会:

const *char[] = {("foo"), ("bar")};  // OK

所以,简而言之,你不能有某种方式显式地告诉编译器两个字符串可以连接,并且在所有其他情况下都失败,所以你必须显式地告诉编译器什么时候字符串可以 * 不 * 连接。

相关问题