clang: <string literal> + <expression returning int> 导致令人困惑的警告:将 'int' 添加到字符串不会附加到字符串
clang: <string literal> + <expression returning int> leads to confusing warning: adding 'int' to a string does not append to the string
此代码:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag = true;
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
return 0;
}
使用 -std=c11 -pedantic
编译会导致警告:
main.c:7:27: warning: adding 'int' to a string does not append to the string
[-Wstring-plus-int]
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
~~~~~~~~~^~~~~~~~~~~~~~~~~~
main.c:7:27: note: use array indexing to silence this warning
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
^
& [ ]
1 warning generated.
然而,这段代码:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag = true;
printf("%s\n", ("xxxzzz") + ( flag ? 3 : 0 ));
return 0;
}
使用 -std=c11 -pedantic
编译不会导致警告。
为什么会出现这个警告?
为什么 ()
很重要?
P.S。 gcc / msvc 在这两种情况下都不会生成警告。
这个警告只是因为代码是非惯用的(即指针算法的不寻常使用),来自其他语言的人可能希望 RHS 的自动字符串转换创建 "xxxzzz3"
或 "xxxzzz0"
.
它是编译器发现的代码模式,这些模式在其他语言中可能很常见,但在 C 中具有不同且可能意想不到的语义。它正在努力提供帮助并防止常见错误。
在任何情况下,它建议使用数组索引语义在语义清晰方面可能是更好的解决方案,但使用括号显然具有抑制警告的相同效果。
此代码:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag = true;
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
return 0;
}
使用 -std=c11 -pedantic
编译会导致警告:
main.c:7:27: warning: adding 'int' to a string does not append to the string
[-Wstring-plus-int]
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
~~~~~~~~~^~~~~~~~~~~~~~~~~~
main.c:7:27: note: use array indexing to silence this warning
printf("%s\n", "xxxzzz" + ( flag ? 3 : 0 ));
^
& [ ]
1 warning generated.
然而,这段代码:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag = true;
printf("%s\n", ("xxxzzz") + ( flag ? 3 : 0 ));
return 0;
}
使用 -std=c11 -pedantic
编译不会导致警告。
为什么会出现这个警告?
为什么 ()
很重要?
P.S。 gcc / msvc 在这两种情况下都不会生成警告。
这个警告只是因为代码是非惯用的(即指针算法的不寻常使用),来自其他语言的人可能希望 RHS 的自动字符串转换创建 "xxxzzz3"
或 "xxxzzz0"
.
它是编译器发现的代码模式,这些模式在其他语言中可能很常见,但在 C 中具有不同且可能意想不到的语义。它正在努力提供帮助并防止常见错误。
在任何情况下,它建议使用数组索引语义在语义清晰方面可能是更好的解决方案,但使用括号显然具有抑制警告的相同效果。