我一直试图使用宏连接(35;##)和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宏的结果。能做到吗?谢谢你抽出时间。

最佳答案

你不能随心所欲。offsetof是(类似于sizeof)在预处理之后,在编译过程中计算的。
看看你的源代码的预处理形式。使用g cc,您可以使用gcc -C -E CMain.c > CMain.i获得它,然后使用编辑器(或寻呼机)查看内部CMain.i例如less CMain.i

10-08 00:33