在C中可以提取函数返回类型吗?

bksxznpy  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(74)

我正在使用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>的功能?

mwecs4sa

mwecs4sa1#

你可以得到类型(在GCC中)--但是你需要调用函数。

char foo(void)
{
    return 'a';
}

double bar(void)
{
    printf("BAR\n");
    return 0.0;
}

#define ptype(x) _Generic((x), \
                        char: printf("char\n"), \
                        double: printf("double\n"))

int main(void)
{
    __auto_type a = foo();
    __auto_type b = bar();

    printf("%zu\n", sizeof(a));
    printf("%zu\n", sizeof(b));

    ptype(a);
    ptype(b);
}

字符串
https://godbolt.org/z/Mej5azzhP

r3i60tvu

r3i60tvu2#

我怀疑可能有一种更简单的方法来做到这一点(例如,一些编译器特定的内置),但你可能会这样做:

#include <stdio.h>

#define get_type(X) _Generic((X), \
    int (*)(void): "int",   \
    float (*)(void): "float",        \
    default: "??"       \
)

#define print_type(X) \
    printf("%s\n%s\n%s\n%s\n", \
        __PRETTY_FUNCTION__, \
        __FUNCTION__, \
        __func__, \
        get_type(X) \
    );

int
foo(void) {
    print_type(foo);
    return 1;
}

float
bar(void) {
    print_type(bar);
    return 1.0;
}

int
main(void)
{
    foo();
    bar();
}

字符串
如果你有很多不同的函数类型,你会在_Generic中得到一个组合爆炸的情况,但也许这样就足够了。

相关问题