goz*_*zag 27 c c++ string warnings
有没有办法警告或禁止文字字符串连接,例如:
const char *a = "foo" " bar";
Run Code Online (Sandbox Code Playgroud)
我花了几个小时在一个大型静态数组中发现了一个错误
const char * a[] = {"foo" "bar"};
Run Code Online (Sandbox Code Playgroud)
代替
const char * a[] = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)
cig*_*ien 50
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"};
^
,
Run Code Online (Sandbox Code Playgroud)
这对于您展示的玩具示例并不完全适用,因为您需要有多个初始值设定项,并且只在几个地方缺少逗号,即:
// no warning
char const *b[] = {"foo" "bar"};
// no warning
char const *c[] = {"ok", "foo" "bar"};
// no warning
char const *d[] = {"foo" "bar", "ok"};
Run Code Online (Sandbox Code Playgroud)
但是,当数组中有大量初始值设定项并且仅在几个地方出现拼写错误时,这似乎是理想的选择。
这是一个演示。
GCC 似乎没有类似的警告,但有人要求添加它。
请注意,这仅适用于数组初始化。你的例子
const char *x = "foo" " bar";
Run Code Online (Sandbox Code Playgroud)
此警告(或我知道的任何其他警告)不会检测到。
另请注意,启用此警告可能会产生大量误报,但在尝试捕获错误时可以谨慎使用它。
nie*_*sen 18
并不真地。字符串文字连接是 C/C++ 语法中不可或缺的一部分,并且有很多用例。因此,需要付出某种努力,但这可能会达不到发现错误的目标。
然而,字符串连接对于两个连续出现且中间只有空格的字符串文字非常严格,因此破坏空格将导致错误。例如,在这种情况下你可以写:
const *char[] = {("foo") ("bar")}; // Error
Run Code Online (Sandbox Code Playgroud)
这会导致错误,而预期的语句不会:
const *char[] = {("foo"), ("bar")}; // OK
Run Code Online (Sandbox Code Playgroud)
因此,简而言之,您无法通过某种方式显式地告诉编译器两个字符串文字可以连接并在所有其他情况下失败,因此您必须显式地告诉编译器何时不能连接字符串文字。
| 归档时间: |
|
| 查看次数: |
3398 次 |
| 最近记录: |