我想使用第三方函数,它通过一个充满函数指针的结构提供API。例如:
struct S {
using p_func1 = int(*)(int, int);
p_func1 func1;
using p_func2 = int(*)(char*);
p_func2 func2;
}
第三方库初始化此结构。需要检查这些函数的返回值(func1,func2),我希望我能以某种方式在[[discard]]
属性上显示,以确保检查返回值。
有没有办法做到这一点,同时保持结构的ABI?
编辑:到目前为止,我能想到的最好的是另一个结构,如下所示:
struct S_wrap {
S orig;
[[nodiscard]] int func1(int a, int b){ return orig.func1(a, b); }
[[nodiscard]] int func2(char* a){ return orig.func2(a); }
}
我希望有更好的东西
您的包装器(或任何包装器)是唯一的方法。该属性适用于函数declarator-id(其名称),而不是函数的类型。所以它在使用指针时丢失了,也不能应用于指针本身:
[Dcl.attr.nodiscard]
1属性标记
nodiscard
可以应用于函数声明中的declarator-id或类或枚举的声明。它应该在每个属性列表中最多出现一次,并且不存在attribute-argument-clause。
因此,如果函数指针返回int
,防止丢弃结果的唯一方法是使用某种带有已应用属性的命名函数(或operator()
)的包装器。