Concat(##)将offsetof的结果转换为标识符?

时间:2014-03-01 18:59:37

标签: c

我一直在尝试使用宏连接(##)和 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的结果。可以这样做吗?谢谢你的时间。

2 个答案:

答案 0 :(得分:4)

你无法做你想做的事。在编译之前,offsetof是在预处理后计算的(如sizeof)。

查看源代码的预处理形式。使用GCC,您可以使用gcc -C -E CMain.c > CMain.i获取它,然后使用编辑器(或寻呼机)查看内部CMain.i,例如less CMain.i

答案 1 :(得分:2)

你做不到。

为了实现您的目标,C预处理器需要了解程序员定义的所有C内置数据类型和类型,太多