2013-11-29 2 views
1

Я объявляю все свои структуры, используя следующий макрос ..гр структуры, которые содержат указатели на функции

#define structure      typedef struct 

с этим я объявляю структуру, например

structure 
{ 
    int foo; 
    int(*proc)(void*); 
} 
_myobject; 

член Proc, действительно получил аргумент, который является указателем к строению, в котором он принадлежит.

eg

myobj.proc(&myobj); 

Мой вопрос, как я могу объявить элемент proc с типом будучи переданную ей в качестве структуры, а не void * .. Я знаю, что это не делает разница, это только для эстетики, так как я провел много времени держать мой код чистый ..

structure 
{ 
    int foo 
    int(*foo)(_myobject*); 
} 
_myobject; 

производит:

error: expected ':', ',', ';', '}' or '__attribute__' before 'int'| 
+0

Вы указали 'proc' как указатель на функцию, нет? –

ответ

4

Вы пытаетесь обращаться к своей структуре рекурсивно, что не очень хорошо сочетается с typedefs. Один из следующих следует сделать:

typedef struct _myobject _myobject; 
struct _myobject { 
    int foo; 
    int (*proc)(_myobject*); 
}; 

...

typedef struct _myobject { 
    int foo; 
    int (*proc)(struct _myobject*); 
} _myobject; 

редактировать: Если вы хотите продолжать использовать structure как можно больше (хотя на самом деле, кроме как для совместимости с существующей код, я не уверен, почему вы хотите), вы могли бы сделать:

structure _myobject _myobject; 
struct _myobject { 
    int foo; 
    int (*proc)(_myobject*); 
}; 

...

structure _myobject { 
    int foo; 
    int (*proc)(struct _myobject*); 
} _myobject; 

Хотя для обоих из них потребуется использовать идентификатор struct, если вы хотите этого избежать.

+0

проблема - существующий источник (> 50k строк), полон структуры - я покончил со всем struct identifer *, - –

+0

Я склонен согласиться, нет чистого решения для этого .. ok - Закройте вопрос - спасибо –

1

Вы можете изменить макрос немного:

#define structure(x,y)      typedef struct x y x 

structure (_myobject, 
{ 
int foo; 
int(*proc)(struct _myobject*); 
} 
); 

который выглядит плохо для меня. Другой способ сделать это:

#define structure      typedef struct 

structure _myobject 
{ 
int foo; 
int(*proc)(struct _myobject*); 
} 
_myobject; 
Смежные вопросы