我正在使用gcc编译器编译一个C程序。下面的代码只打印函数名:
int main(void) {
printf("%s\n", __PRETTY_FUNCTION__); // prints "main"
printf("%s\n", __FUNCTION__); // prints "main"
printf("%s\n", __func__); // prints "main"
return 0;
}
字符串
而我想打印函数返回类型int
。这可能吗?
更新:这是我正在努力实现的目标:
typedef struct {
// ...
// data specific to A;
uint32_t error;
} StructA;
typedef struct {
// ...
// data specific to B
uint32_t error;
} StructB;
typedef struct {
// ...
// data specific to C
uint32_t error;
} StructC;
#define CHECK(data, ReturnType)
{
if (data.error) {
return (ReturnType) { .error = data.error };
}
}
// Returns either a success value or an error code
StructC build_c() {
StructA a = ...;
CHECK(a, StructC); // want to avoid having to type StructC
StructB b = ...;
CHECK(b, StructC); // want to avoid having to type StructC
return (StructC) { .data = a.data + b.data };
}
型
我希望有一个错误处理宏,适用于任何包含字段“错误”的结构类型。在C++中,可以让这样的宏与absl::StatusOr<Something>
一起工作。有没有可能在C中实现类似于macros+ absl::StatusOr<Something>
的功能?
2条答案
按热度按时间mwecs4sa1#
你可以得到类型(在GCC中)--但是你需要调用函数。
字符串
https://godbolt.org/z/Mej5azzhP
r3i60tvu2#
我怀疑可能有一种更简单的方法来做到这一点(例如,一些编译器特定的内置),但你可能会这样做:
字符串
如果你有很多不同的函数类型,你会在_Generic中得到一个组合爆炸的情况,但也许这样就足够了。