gpt4 book ai didi

c++ - "Forwarding"字符串文字

转载 作者:太空狗 更新时间:2023-10-29 23:15:27 25 4
gpt4 key购买 nike

我正在处理一个库,它有一个可变参数宏,可以像 printf 一样使用

#define PRINTF_LIKE (FORMAT, ...) //Some statement expression

因为需要 PRINTF_LIKE 来评估某些东西,并且为了避免通常的 if 和悬空的 else 问题,宏有多个语句,它是使用 gcc's statement expressions 实现的.但是,我需要我的代码使用英特尔编译器构建,它不允许 destructible entities inside a statement expression .这意味着我不能写这样的代码:

PRINTF_LIKE("%s", getString().c_str());

其中 getString 返回一个 std::string。为了解决这个问题,我有一个简单的可变参数模板包装器。

template <typename ... Rest>
int callPrintfLike(const char* const format, Rest... rest)
{
return PRINTF_LIKE(format, rest...);//warning: format string is not a string literal [-Wformat-nonliteral]
}

然后像这样使用它:

callPrintfLike("%s", getString().c_str());//warning as shown in the above comment

这触发了 clang 和 gcc 的 -Wformat-nonliteral 警告。有没有办法让我以某种方式“转发”字符串文字并仅在未使用字符串文字调用 callPrintfLike 时触发此警告?

编辑:下面的答案之一建议使用 __attribute__((format))。然而,that doesn't work因为 format 属性需要可变函数。

最佳答案

我通过关闭该函数的警告来绕过它,但提供了另一个宏来调用它并通过三元运算符的死分支在此处重新启用这些警告。

//Compiler specific pragmas to turn off the -Wformat-security and -Wformat-literal warnings go here

template <typename ... Rest>
int callPrintfLike(const char* const format, Rest... rest)
{
return PRINTF_LIKE(format, rest...);
}

//Pop diagnostic pragmas

#define NEW_PRINTF_LIKE (FORMAT, ...) (true ? callPrintfLike(FORMAT, ##__VA_ARGS__) : printf(FORMAT, ##__VA_ARGS__))

NEW_PRINTF_LIKE 中,printf(FORMAT, ##__VA_ARGS__) 永远不会被执行。但是,printf 调用的编译时检查以及有关非文字 FORMAT 和与格式字符串不匹配的参数的警告仍将启用。

关于c++ - "Forwarding"字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29176591/

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