LINUX.ORG.RU

Структура в прототипе функции и наоборот


0

0

Народ,

Такая проблема: есть структура

typedef struct _typedesc { ............. _CPFPLUS function; ............. } TypeDescription;

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

typedef char *( * _CPFPLUS )( ........ TypeDescription [], .......... );

Кто будет так добр и подскжет, как заставить такое работать?

anonymous

А кто мешает в описании функции написать не TypeDescriptor xxx[],
а struct _typedesc xxx[]?
Второе точно не известно, а первое уже формально определено,
хотя определение и не завершено.
Можно, конечно, и через предварительное
typedef struct _typedesc TypeDescriptor;
typedef struct _typedesc {
// Здесь уже можно все
...
};

io ★★
()
Ответ на: комментарий от Murr

Так работает, но я не знаю, правильно ли это с точки зрения С

struct _typedesc;

typedef char *( * _CPFPLUS )(char *, ... , _typedesc[], ... , char *);

typedef struct _typedesc {

.........

_CPFPLUS function;

.........

} TypeDescription;

anonymous
()
Ответ на: комментарий от io

Блин, надо ANSI C поднять, че-то я вообще фигово как-то ориентируюсь. Для потомков - научный тык показал следующее:

Без обьявления

struct _typedesc

вполне логично получаем сообщение:

common.h:43: warning: `struct _typedesc' declared inside parameter list common.h:43: warning: its scope is only this definition or declaration, which is probably not what you want

Следующее тоже не катит:

struct _typedesc TypeDescription;

common.h:57: warning: useless keyword or type name in empty declaration common.h:117: parse error before "TypeDescription"

-------------------------------------------------------

typedef char *( * _CPFPLUS )(char *, ... , _typedesc[], ... , char *);

typedef struct _typedesc {

.........

_CPFPLUS function;

.........

} TypeDescription;

Если кто с формальной стороной языка хорошо разбирается, не могли бы пояснить, пожалуйста?

anonymous
()
Ответ на: комментарий от anonymous

struct _typedesc;

typedef char *( * _CPFPLUS )(char *, struct _typedesc[], char *);

typedef struct _typedesc {

_CPFPLUS function;

} TypeDescription;

int main() {
    return 0;
}

gcc -Wall test.c
и gcc -Wall test.cpp компилируют без предупреждений. ;)

Murr ★★
()

typedef struct _TypeDescription TypeDescription; typedef char *(*_CPFPLUS )(char *, TypeDescription[], char *);

struct _TypeDescription { _CPFPLUS function; };

int main() { return 0; }

anonymous
()
Ответ на: комментарий от anonymous

typedef struct _typedef {
// We can do it
char *(*test)(struct _typedef qqq[]);
} TypeStruct;

gcc -c -Wall также без проблем

io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.