模板实现与c中的指针兼容

时间:2014-10-10 02:41:31

标签: c templates gcc precompile

#define MAX_SIZE 32
#define DECLEAR_RINGQUEUE(type) \
typedef struct RINGQUEUE_##type{ \
    type data[MAX_SIZE]; \
}RINGQUEUE_##type; \
...someMethod

DECLEAR_RINGQUEUE(structA)
DECLEAR_RINGQUEUE(int*)

角色' *'影响结构的名称,我该如何解决这个问题.. 任何预处理器指令可用? 或者我必须重新声明其他定义,如

#define DECLEAR_RINGQUEUE_ptr(type) \
typedef struct RINGQUEUE_##type{ \
    type* data[MAX_SIZE]; \
}RINGQUEUE_##type; \

1 个答案:

答案 0 :(得分:1)

使用"裸体"类型,我不认为你可以在没有额外宏的情况下完成,因为int*是两个独立的令牌。

所以你的单独宏是可能的,但我会稍作改动以区分intint*

#define DECLEAR_RINGQUEUE_ptr(type) \
    typedef struct RINGQUEUE_ptr_##type{ \
        type *data[MAX_SIZE]; \
    } RINGQUEUE_ptr_##type;

正如您目前所拥有的那样,两者都会创建相同的structtypedef名称,从而导致错误。


但是,如果您首先typedef指针类型,并将其显示为一个标记,则可以使用以下内容:

typedef int* pInt;
DECLEAR_RINGQUEUE(pInt);

这应该有效,基于以下代码的事实:

#define MAX_SIZE 32

#define DECLEAR_RINGQUEUE(type) \
    typedef struct RINGQUEUE_##type { \
        type data[MAX_SIZE]; \
    } RINGQUEUE_##type

DECLEAR_RINGQUEUE(int);

typedef int* pInt;
DECLEAR_RINGQUEUE(pInt);

在通过预处理器时生成:

typedef struct RINGQUEUE_int { int data[32]; } RINGQUEUE_int;

typedef int* pInt;
typedef struct RINGQUEUE_pInt { pInt data[32]; } RINGQUEUE_pInt;

并且编译没有错误。