提问者:小点点

C/C不允许文字字符串连接


有没有办法警告或禁止文字字符串连接,例如:

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

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

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

而不是

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

共2个答案

匿名用户

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

但是,当数组中有大量初始化器并且只在几个地方输入错别字时,这似乎是理想的。

这是一个演示。

GCC似乎没有等效的警告,但有添加警告的请求。

请注意,这仅适用于数组初始化。你的例子

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

不会被此警告(或我知道的任何其他警告)检测到。

另请注意,启用此警告可能会产生大量误报,但您可以在尝试捕获错误时谨慎使用它。

匿名用户

不完全是。字符串文字连接是C/C语法中不可或缺的一部分,并且有许多用例。因此需要某种努力,这可能会破坏抓住错误的目标。

但是,字符串连接非常严格地适用于彼此之后出现的两个字符串文字,中间只有空格,因此破坏空格将导致错误。例如,在这种情况下,您可以编写:

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

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

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

因此,简而言之,您不能有某种方法来显式告诉编译器两个字符串文字可能被连接并且在所有其他情况下都失败,因此您必须显式告诉编译器字符串文字何时可能不被连接。

相关问题