2013-03-25 3 views
5

У меня возникла своеобразная проблема. Лучше всего просто показать вам, что я пытаюсь сделать, а затем объяснить.Передовая декларация функции pointer typedef

typedef void functionPointerType (struct_A * sA); 

typedef struct 
{ 
    functionPointerType ** functionPointerTable; 
}struct_A; 

В принципе, у меня есть структура struct_A с указателем на таблицу указателей на функции, которые имеют параметр типа struct_A. Но я не уверен, как получить эту компиляцию, так как я не уверен, как или если можно переслать объявление об этом.

Кто-нибудь знает, как это можно достичь?

редактировать: незначительные исправления в коде

ответ

9

вперед объявить, как вы предлагаете:

/* Forward declare struct A. */ 
struct A; 

/* Typedef for function pointer. */ 
typedef void (*func_t)(struct A*); 

/* Fully define struct A. */ 
struct A 
{ 
    func_t functionPointerTable[10]; 
}; 

Например:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct A; 

typedef void (*func_t)(struct A*); 

struct A 
{ 
    func_t functionPointerTable[10]; 
    int value; 
}; 

void print_stdout(struct A* a) 
{ 
    printf("stdout: %d\n", a->value); 
} 

void print_stderr(struct A* a) 
{ 
    fprintf(stderr, "stderr: %d\n", a->value); 
} 

int main() 
{ 
    struct A myA = { {print_stdout, print_stderr}, 4 }; 

    myA.functionPointerTable[0](&myA); 
    myA.functionPointerTable[1](&myA); 
    return 0; 
} 

Выход:

 
stdout: 4 
stderr: 4 

Смотреть онлайн демо http://ideone.com/PX880w.


Как уже уже упоминалось, можно добавить:

typedef struct A struct_A; 

до указателя функции typedef и полное определение struct A, если предпочтительнее опустить struct ключевое слово.

+0

синтаксис для этого всегда бросил меня. – Claudiu

+0

«Как уже говорили другие». Вы можете просто добавить его в свой ответ, а затем я могу удалить свою. Я думаю, что это сделает ваш ответ лучше, и это тот, который поднялся на вершину. –

+0

@DavidHeffernan, спасибо. Пример изобретателен, и полезность дополнительного 'typedef' на самом деле не передается (' struct A' или 'struct_A'). – hmjd

1

Я думаю, что это то, что вы ищете:

//forward declaration of the struct 
struct _struct_A;        

//typedef so that we can refer to the struct without the struct keyword 
typedef struct _struct_A struct_A;    

//which we do immediately to typedef the function pointer 
typedef void functionPointerType(struct_A *sA); 

//and now we can fully define the struct  
struct _struct_A       
{ 
    functionPointerType ** functionPointerTable; 
}; 
0

Там еще один способ сделать это:

typedef struct struct_A_ 
{ 
    void (** functionPointerTable) (struct struct_A_); 
}struct_A; 


void typedef functionPointerType (struct_A); 
Смежные вопросы