考虑以下代码示例:
#define STRING_LITERAL "%u, %u"
const char string_const[ ] = "%u, %u";
snprintf(dest_buff, sizeof(dest_buff), STRING_LITERAL, arg1, arg2, arg3);然后,我的编译器发出警告:格式字符串在此参数之前结束。
现在,如果我将指令更改为:
snprintf(dest_buff, sizeof(dest_buff), string_const, arg1, arg2, arg3);然后编译器就不会发出警告。
我的问题是:这样的行为是否符合C99标准?
发布于 2015-04-22 09:52:56
该警告是由编译器生成的,编译器能够确定您向调用传递了不正确的参数,而在第二次调用中没有。
标准定义传递不正确的参数和/或使用不正确的标志会导致未定义的行为。
这个警告不是标准所要求的,它只是对程序员的额外帮助。
发布于 2015-04-22 09:52:45
我的问题是:这样的行为是否符合C99标准?
这两个示例都调用未定义的行为,但不违反约束或语法规则,因此不需要诊断。
发布于 2015-04-22 09:53:20
你们有太多的争论,应该是:
#define STRING_LITERAL "%u, %u"
snprintf(dest_buff, sizeof(dest_buff), STRING_LITERAL, arg1, arg2);或者:
#define STRING_LITERAL "%u, %u, %u"
snprintf(dest_buff, sizeof(dest_buff), STRING_LITERAL, arg1, arg2, arg3);缺少警告的原因是它是未定义的行为,只有当编译器聪明到认为出了问题时才会发出警告。如果字符串直接位于snprintf命令中,编译器似乎足够聪明,如果字符串间接传递,则似乎不是。
https://stackoverflow.com/questions/29793738
复制相似问题