C中只有一次伪通用标头

时间:2015-03-14 18:53:57

标签: c templates generics header-files c-preprocessor

关于我在this question上询问的泛型向量的一些工作之后,我想知道是否有任何方法可以检查每个类型的库的每个实例只进行一次。

以下是当前头文件的样子:

#ifndef VECTOR_GENERIC_MACROS
#define VECTOR_GENERIC_MACROS

    #ifndef TOKENPASTE
    #define TOKENPASTE(a, b) a ## b
    #endif

    #define vector_t(T) TOKENPASTE(vector_t_, T)

    #define vector_at(T) TOKENPASTE(*vector_at_, T)

    #define vector_init(T) TOKENPASTE(vector_init_, T)
    #define vector_destroy(T) TOKENPASTE(vector_destroy_, T)
    #define vector_new(T) TOKENPASTE(vector_new_, T)
    #define vector_delete(T) TOKENPASTE(vector_delete_, T)

    #define vector_push_back(T) TOKENPASTE(vector_push_back_, T)
    #define vector_pop_back(T) TOKENPASTE(vector_pop_back_, T)
    #define vector_resize(T) TOKENPASTE(vector_resize_, T)
    #define vector_reserve(T) TOKENPASTE(vector_reserve_, T)

#endif

typedef struct {
    size_t size;
    size_t capacity;
    TYPE *data;
} vector_t(TYPE);

inline TYPE vector_at(TYPE)(vector_t(TYPE) *vector, size_t pos);

void vector_init(TYPE)(vector_t(TYPE) *vector, size_t size);
void vector_destroy(TYPE)(vector_t(TYPE) *vector);
inline TYPE *vector_new(TYPE)(size_t size);
inline void vector_delete(TYPE)(vector_t(TYPE) *vector);

void vector_push_back(TYPE)(vector_t(TYPE) *vector, TYPE value);
inline TYPE vector_pop_back(TYPE)(vector_t(TYPE) *vector);
inline void vector_resize(TYPE)(vector_t(TYPE) *vector, size_t size);
void vector_reserve(TYPE)(vector_t(TYPE) *vector, size_t size);

然后可以将标题与源定义一起包括在内:

#include <stdio.h>

#define TYPE int
#include "vector.h"
#include "vector.def"
#undef TYPE

int main()
{
    vector_t(int) myVectorInt;
    vector_init(int)(&myVectorInt, 0);

    for (int i = 0; i < 10; ++i)
        vector_push_back(int)(&myVectorInt, i);

    for (int i = 0; i < myVectorInt.size; ++i)
        printf("%d ", ++vector_at(int)(&myVectorInt, i));

    vector_destroy(int)(&myVectorInt);
    return 0;
}

我想确保每个TYPE只包含一次最后一个endif下面的内容。

显然,#ifde VECTOR_INSTANCE(TYPE)不起作用,所以我真的没有想法......

1 个答案:

答案 0 :(得分:0)

建议:

从vector.h文件中删除原型。

将原型放在vector.def文件的顶部。

从vector.h文件中删除typedef结构

将typedef结构放在vector.def文件中的原型之前。

然后,对于vector.h文件,多次#include语句将没有任何不良影响。

然后在每个要使用这些矢量类型的源文件中使用以下内容:

#include<vector.h>

#define TYPE int
#include<vector.def>
#undef TYPE

#define TYPE char
#include<vector.def>
#undef TYPE
... etc


BTW:
There is no library involved, so I'm a bit confused by the reference 
to 'library' in the question

It may be worthwhile to also prefix the 'static' modifier 
to each of the function definitions so the definitions are 
not visible across source files

It may be worthwhile to use parens around the parameters to TOKENPASTE
so modifiers like 'static' and.or 'const' 
can be prefixed to the function names.