在GCC中找到一种识别变量数据类型的方法

qnyhuwrf  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(155)

我相信我的问题可以用下面的代码片段来解释

#define stingify(str) #str

int main()
{
    int a;
    printf("%s\n" , stringify(typeof(a)));
    return 0;
}

我想先展开typeof()宏,然后再展开stringify()宏,以得到字符串形式的预期输出“int”。有什么可能的方法吗?

k3bvogb1

k3bvogb11#

对于纯标准C,可以使用_Generic

#define stringify_typeof(obj)  \
  _Generic((obj),              \
           int:    "int",      \
           double: "double")   \

如果希望此类型列表更易于维护,可以将其移到X宏中:

#include <stdio.h>

#define SUPPORTED_TYPES(X)     \
  X(int)                       \
  X(double)                    \
/* keep on adding types here */

#define GENERIC_LIST(type) ,type: #type
#define stringify_typeof(obj) _Generic((obj) SUPPORTED_TYPES(GENERIC_LIST) )

int main()
{
    int a;
    printf("%s\n" , stringify_typeof(a));

    double b;
    printf("%s\n" , stringify_typeof(b));

    return 0;
}
ztigrdn8

ztigrdn82#

如果要打印类型名称,可以使用genetic宏。

char *typei()
{
    return "signed integer";
}

char *typeui()
{
    return "unsigned integer";
}

char *typef()
{
    return "float";
}

char *typeunk()
{
    return "unknown";
}

#define type(X) _Generic((X), \
        int: typei, \
        unsigned: typeui,  \
        float: typef,  \
        default: typeunk \
        )(X)
 
int main(void)
{
    const float y = 2.0f;

    printf("The type is: %s\n", type(y));
    printf("The type is: %s\n", type(3.0));
    printf("The type is: %s\n", type(3));
    printf("The type is: %s\n", type(3U));
    printf("The type is: %s\n", type(3LU));
}

输出量:

The type is: float
The type is: unknown
The type is: signed integer
The type is: unsigned integer
The type is: unknown

https://godbolt.org/z/WMr5xs5os

相关问题