gpt4 book ai didi

c++ - gcc:混合 -Wformat 和 register_printf_specifier

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:28 30 4
gpt4 key购买 nike

我想使用自定义 printf 格式标志(通过 gcc 的 register_printf_specifier),同时仍然享受 -Wformat-Werror 编译器的好处旗帜。

在下面的示例中,我设法使用自定义 %W 标志打印我的小部件,但我必须禁用 -Wformat-Wformat-extra -args

#pragma GCC diagnostic ignored "-Wformat"
#pragma GCC diagnostic ignored "-Wformat-extra-args"

有没有可能两全其美?

我想我的问题归结为:有没有办法用 -Wformat 注册格式说明符和关联类型?

示例:

#include <cstdio>
#include <cstdlib>
#include <printf.h>

struct Widget
{
const char* name;
};

int print_widget(FILE* stream, const struct printf_info* info, const void* const* args)
{
const Widget* widget = *((const Widget**)(args[0]));
return fprintf(stream, "%*s", (info->left ? -info->width : info->width), widget->name);
}

int print_widget_arginfo(const struct printf_info*, size_t n, int* argtypes, int* size)
{
if (n > 0)
{
argtypes[0] = PA_POINTER;
size[0] = sizeof (Widget *);
}
return 1;
}

int main(void)
{
register_printf_specifier('W', print_widget, print_widget_arginfo);

Widget widget { "foobar" };

#pragma GCC diagnostic ignored "-Wformat"
#pragma GCC diagnostic ignored "-Wformat-extra-args"

printf("|%W|\n", &widget);
printf("|%35W|\n", &widget);
printf("|%-35W|\n", &widget);
}

输出:

|foobar|
| foobar|
|foobar |

最佳答案

目前没有这种方式。参见 this gcc bug .

修改 GCC 以公开其内部机制以供 printf 检查并不难,从而可以编写理解您的添加的 GCC 插件。不过,它确实需要对 GCC 有一点熟悉。

关于c++ - gcc:混合 -Wformat 和 register_printf_specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29160437/

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