我一直在尝试使用宏连接(##)和 offsetof 宏来生成一个没有成功的标识符:
CMain.c:55: warning: implicit declaration of function 'Color__builtin_offsetof'
struct Color_methods_TABLE
{
struct
{
int8 getColor;
}
methods;
};
#define METHOD_NAME1(clazz, method) clazz##method
#define METHOD_NAME(clazz, method) METHOD_NAME1(clazz, method)
#define tdef_name(clazz, method) METHOD_NAME(clazz, method)
int main()
{
tdef_name(Color, offsetof(struct Color_methods_TABLE, methods.getColor));
return 0;
}
输出应为:
Color0
其中0是offsetof macro的结果。可以这样做吗?谢谢你的时间。
答案 0 :(得分:4)
你无法做你想做的事。在编译之前,offsetof
是在预处理后计算的(如sizeof
)。
查看源代码的预处理形式。使用GCC,您可以使用gcc -C -E CMain.c > CMain.i
获取它,然后使用编辑器(或寻呼机)查看内部CMain.i
,例如less CMain.i
答案 1 :(得分:2)
你做不到。
为了实现您的目标,C预处理器需要了解程序员定义的所有C内置数据类型和类型,太多。