gpt4 book ai didi

c++ - 如何使变量成为文字字符串

转载 作者:行者123 更新时间:2023-11-30 03:16:37 25 4
gpt4 key购买 nike

代码如下:

FILE *sfp;
....

void test(char *s, ...)
{
va_list ap;
va_start(ap, s);
vfprintf(sfp, s, ap);
fflush(sfp);
va_end(ap);
}

报告以下编译错误:

error: format string is not a string literal [-Werror,-Wformat-nonliteral]
vfprintf(sfp, s, ap);

如何修复这个错误?

最佳答案

变量永远不是字符串文字。字符串文字是用双引号括起来的字符序列(即 "foo")。

该警告的目的是警告您编译器无法确认提供给 vfptrintf 的参数类型是否与格式字符串匹配。要消除该警告,您需要要么

  1. 将文字格式字符串传递给 vfprintf(即 vfprintf(sfp, "%d\n", ap))
  2. 禁用(或者更确切地说,不启用)该警告,并接受如果您的参数与格式说明符不匹配,编译器将无法警告您。
  3. format 属性添加到您的函数声明中(感谢评论中的@chris):

__attribute__((format(printf, 2, 3)))
void test(FILE* sfp, const char *s, ...)
{
//...
}

或者使用标准化的 C++11 属性语法:

[[gnu::format(printf, 2, 3)]]
void test(FILE* sfp, const char *s, ...)
{
//...
}

请注意,最后一个选项不是标准的 C++ 属性,因此不适用于所有编译器。例如,您可能需要其他东西来安抚 MSVC。按照标准,如果您使用 C++11 语法,编译器应该忽略未知属性,但它们仍可能发出警告,让您立即回到与现在相同的情况。

如果使用本身不是字符串文字的第二个参数调用 test,您仍然会引发警告。


作为旁注,看起来 clang 无论如何都不能检查 va_list printf 函数的参数类型,所以 -Wformat-nonliteral 实际上不是在这种情况下很有帮助。 GCC 不会发出此警告,可能正是出于这个原因。

关于c++ - 如何使变量成为文字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com