我相信我的问题可以用下面的代码片段来解释
#define stingify(str) #str int main() { int a; printf("%s\n" , stringify(typeof(a))); return 0; }
我想先展开typeof()宏,然后再展开stringify()宏,以得到字符串形式的预期输出“int”。有什么可能的方法吗?
typeof()
stringify()
k3bvogb11#
对于纯标准C,可以使用_Generic:
_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; }
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
2条答案
按热度按时间k3bvogb11#
对于纯标准C,可以使用
_Generic
:如果希望此类型列表更易于维护,可以将其移到X宏中:
ztigrdn82#
如果要打印类型名称,可以使用genetic宏。
输出量:
https://godbolt.org/z/WMr5xs5os