указатели на функции и аргументы указателя в C - PullRequest
3 голосов
/ 25 апреля 2011

Завершите noob до C, только начав с какого-то безделья, задаваясь вопросом, как (читайте ", если "), возможно следующее:

Попытка создать structс членом, который является указателем на функцию, а указатель на функцию указывает на функцию, которая принимает аргумент того же типа, что и вышеупомянутый struct.Например (обратите внимание на синтаксис, просто ознакомьтесь здесь):

typedef struct{
    void (*myStructFunc)(void);
} MyStructType;

void myFunc(void){
    printf("Hello world!");
}

// ...

MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(); // <= Hello world!

Этот работает нормально, но когда я пытаюсь ввести аргументы типа MyStructType для функции:

typedef struct{
    void (*myStructFunc)(*MyStructType); // <= parse error
} MyStructType;

void myFunc(MyStructType *myStruct){
    printf("Hello world!");
}

// ...

MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(&myStruct);

Эти примеры являются краткими по очевидным причинам, но они иллюстрируют мои намерения.Опять же, просто намочив ноги с помощью C, поэтому, пожалуйста, простите за любое синтаксическое невежество.

В любом случае, как мне этого добиться?Ясно, что я делаю что-то неправильно синтаксически, или, возможно, я пытаюсь сделать что-то, что просто невозможно.

Также обратите внимание, что причина этого чисто академическая.

Ответы [ 3 ]

5 голосов
/ 25 апреля 2011

Во втором примере имя MyStructType не определено, когда вы объявляете свою функцию.Кроме того, у вас есть * в неправильном месте.Вам нужно сделать что-то похожее на следующее:

typedef struct MyStruct {
    void (*myStructFunc)(struct MyStruct *);
} MyStructType;
2 голосов
/ 25 апреля 2011

Попробуйте:

struct MyStructType {
  void (*myStructFunc)(struct MyStructType*);
};

вместо.В C структуры находятся в своем собственном пространстве имен, поэтому, если вы хотите сослаться на структуру, вам нужно добавить префикс имени к struct.Ваш typedef не виден до после вашего обращения, что является ошибкой.Если вы все еще хотите typedef, вы можете сделать:

typedef MyStructType MyStructType_t;
2 голосов
/ 25 апреля 2011

Ошибка синтаксического анализа исходит от *MyStructType, который выглядит как опечатка, поскольку вы правильно объявили указатель структуры в действительном определении функции.

Исправление, которое все еще является ошибкой, потому что навремя определения struct, typedef не вступило в силу.Эту же проблему можно проиллюстрировать (более четко ИМХО) связанным списком:

typedef struct {
  node *next; // error - what is a node?
  void *data;
} node; // this is where node is defined

Для ее решения необходимо использовать имя struct:

struct node {
  struct node *next;
  void *data;
};

или поставитьсначала typedef, затем определите (снова названное) struct:

typedef struct node node;

struct node {
  node *next;
  void *data;
};

Или (если вы чувствуете себя отвратительно) просто используйте указатель void *:

typedef struct {
  void *next;
  void *data;
} node;

То же относится и к вашей ситуации.

...