函数指针指向函数宏

时间:2017-01-03 16:25:32

标签: c macros function-pointers

早上好,

我正在尝试用C语言编写一个可以接受不同类型的动态数组。

主要结构如下:

typedef struct st_array
{
   void* array;
   uint16_t size;
   uint16_t used;

   void  ( *push )( struct st_array*, void* );
   void* ( *at   )( struct st_array*, uint16_t );
} st_array;

void pushInArray( st_array* this, void* item )
{
    // Check for last occupied bin
    // if equal size, realloc() and increase this->size
    this->array[this->used++] = item;
}

void* getAt( st_array* this, utf16_t idx )
{
    if( idx <= this->used )
        return this->array[idx];
    return NULL;
}

st_array NewArray( uint16_t size )
{
    st_array this;
    this.array = malloc( size * sizeof( void* ) );

    this.push = &pushInArray;
    this.at = &getAt;
    ...
    return this;
 }

为了使用它,我需要在每次调用push()at()时为我的变量类型强制转换:

int item = 13;
st_array a = NewArray( 32 );
a.push( &a, (void*)&item );

int item_ret = *(int*)a.at( &a, 0 );

我宁愿避免使用(虽然它可能很有用,只是为了让程序员知道她在做什么)。 可以定义一个接受类型为参数的函数式宏,但我仍然需要弄清楚如何将它“绑定”到结构函数指针。

我认为最简单的解决方案可能只是将函数式宏定义为(现在编写时没有检查以保持简短):

#define push( a, b ) a->array[a->used++] = ( void* )b
#define get( a, i, t ) *(t*)a->array[i]

并将它们用作:

push( &a, &item );
int item_ret = get( &a, 0, int );

但我不确定如何继续。有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

好的,我总结了一个答案,从我很幸运能收集到的所有建设性意见中学习:

声明的结构textview只能包含指针数组,因为声明被修改为edittext变为st_array

void * array

因此,当void ** array进入数组时,不需要转换为typedef struct st_array { void** array; uint8_t size, used; ... } st_array ,但当void*所需的值时,当然需要显式转换。

最简单的方法是定义函数式宏

push()

指针返回到所需的项目,以便可以轻松执行大小检查(最新的指令仅用于强制在get()的末尾使用#define get( struct_ptr, index, type ) if(index <= struct_ptr->used) (type*)struct_ptr->array[index]; else NULL; (void)index {1}}语句,用于符号一致性。)

由于无法指向函数式宏(宏的代码在编译时被替换,因此没有定义实际函数),为了保持一致性,;函数应该在没有结构内的指针引用。