gpt4 book ai didi

c++ - 将 char 数组传递给函数模板,以便 gcc 可以判断它是文字?

转载 作者:行者123 更新时间:2023-11-30 04:02:48 27 4
gpt4 key购买 nike

我正在尝试将 gcc 的 printf 格式字符串的编译时检查 与 c++11 的可变参数模板包结合起来。

我知道我可以用 gcc 的 __attribute__((format(__printf__, ...)) 装饰器装饰可变参数函数。

我知道我可以将可变参数模板包扩展为可变参数函数。例如:printf(fmt, pack...);

是否可以将两者结合起来?

this question接受的答案指出 gcc 需要 文字 才能进行格式检查。

在下面的示例中,const char array 被传递给可变参数函数和可变参数函数模板。当在 main 中调用 check 时,gcc 可以判断它是一个文字,而不是从 check_t

中调用

有没有什么方法可以将 fmt 字符串传递给 check_t,使 gcc 将其视为文字?

我正在努力实现的工作示例:

#include <iostream>

void check(const char*, ...) __attribute__((format(__printf__, 1, 2)));
void check(const char*, ...)
{
// exists only for the purposes of catching bogus format strings
}

template<typename... Ts>
void check_t(const char fmt[], Ts... ts)
{
// check the format string by expanding ts into the check function
check(fmt, ts...);
}

int main()
{
const char f[] = "foo %s";
check_t(f, 5); // compiles
check(f, 5); // fails to compile
return 0;
}

最佳答案

您可以在模板参数中传递 c 字符串:

template<const char* fmt, typename... Ts>
void check_t(Ts... ts)
{
// check the format string by expanding ts into the check function
check(fmt, ts...);
}

constexpr const char f[] = "foo %s";

int main()
{
check_t<f>(5); // fails to compile
//check(f, 5); // fails to compile
return 0;
}

Live example

关于c++ - 将 char 数组传递给函数模板,以便 gcc 可以判断它是文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24882940/

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