我正在编写一个程序,该程序struct
需要存储有关它所持有的类型的信息。数据在结构内部表示为指向void的指针。我的意思的简短示例:
#include <stdio.h>
struct foo {
void *data;
char *type;
};
int main() {
struct foo bar = {{'a', 'b', 'c'}, "char"};
printf("%s\n", (STRING_TO_TYPE(bar.type))bar.data);
return 0;
}
我需要的实现STRING_TO_TYPE
,将取代宏"char"
用char
。所有这些都可以在编译时根据我的程序的需要进行评估。
我想做的是保存任何类型的对象,因此使用enum
or或检查字符串是否相等将不起作用。
简短的回答:这是不可能的。不是你的方式。宏可以产生令牌(如果需要,可以使用关键字),但是不能将字符串转换为令牌。
也就是说,如果您追求的是真的
struct
中的void *
某处定义其“类型”的a ,struct
的名称中以关键字的形式访问该类型,那么您很可能最终会获得typeof
。这是一个GNU扩展,因此它仅在GCC中可用,但可以使用。
在此处的示例代码中,您将struct
使用MYSTRUCT宏定义某种“类型”,并使用TYPE宏获取该类型。预定义的__COUNTER__宏可以防止重新定义类型(每种类型struct
都是其自己的类型,请参见gcc -E
参考资料),并且有MYSTRUCT的三个宏级别可用于对其进行适当的字符串化。
#include <stdio.h>
#define TYPE(x) typeof(x.type)
#define MYSTRUCT(name, type) MYSTRUCT_INTER(name, type, __COUNTER__)
#define MYSTRUCT_INTER(name, type, counter) MYSTRUCT_RAW(name, type, counter)
#define MYSTRUCT_RAW(xName, xType, xCounter) \
struct mystruct_## xCounter { \
void * data; \
xType type; \
} xName
int main(void) {
MYSTRUCT(foo, int);
foo.data = (void *)42;
TYPE(foo) tmp = foo.data; /* <-- Here, tmp is an int */
printf("%d\n", tmp);
MYSTRUCT(bar, int*);
bar.data = &tmp;
TYPE(bar) tmp2 = bar.data; /* <-- Here, tmp2 is an int* */
printf("%p\n", tmp2);
MYSTRUCT(baz, char*);
baz.data = "Hello world";
printf("%s\n", (TYPE(baz))baz.data);
/* ^Expands to (char *) baz.data */
}
请注意,我仍然需要知道struct
“类型”来确定printf()
的格式代码,但是并没有要求解决此问题。
不要忘记进行编译-std=gnu**
(您需要进行编译typeof
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句