указатель на функцию, структура в качестве параметра - PullRequest
5 голосов
/ 10 августа 2011

Еще раз сегодня с перепечатыванием ..

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

Демонстрация этой проблемы

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

struct tMYSTRUCTURE;

typedef struct{
    int myint;
    void (* pCallback)(struct tMYSTRUCTURE *mystructure);
}tMYSTRUCTURE;


void hello(struct tMYSTRUCTURE *mystructure){
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
    tMYSTRUCTURE mystruct;
    mystruct.pCallback = hello;

    mystruct.pCallback(&mystruct);
    return EXIT_SUCCESS;

}

Но я получаю предупреждение

.. \ src \ retyping.c: 31: 5: предупреждение: передача аргумента 1 из mystruct.pCallback из несовместимого типа указателя .. \ src \ retyping.c: 31: 5: примечание: ожидается "struct tMYSTRUCTURE *", но аргумент имеет тип 'struct tMYSTRUCTURE *'

ожидается "struct tMYSTRUCTURE *", но это "struct tMYSTRUCTURE *", забавно!

Есть идеи как это исправить?

Ответы [ 2 ]

5 голосов
/ 10 августа 2011

Проблема вызвана typedef введением структуры и последующим использованием ключевого слова struct вместе с именем typedef. Форвард, объявивший struct и typedef, решает проблему.

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

struct tagMYSTRUCTURE;
typedef struct tagMYSTRUCTURE tMYSTRUCTURE;

struct tagMYSTRUCTURE {
    int myint;
    void (* pCallback)(tMYSTRUCTURE *mystructure);
};


void hello(tMYSTRUCTURE *mystructure){
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
    tMYSTRUCTURE mystruct;
    mystruct.pCallback = hello;

    mystruct.pCallback(&mystruct);
    return EXIT_SUCCESS;

}
2 голосов
/ 10 августа 2011

Исправленный код:

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

struct tMYSTRUCTURE_;

typedef struct tMYSTRUCTURE_ {
  int myint;
  void (* pCallback)(struct tMYSTRUCTURE_ *mystructure);
} tMYSTRUCTURE;


void hello(tMYSTRUCTURE *mystructure){
  puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
  tMYSTRUCTURE mystruct;
  mystruct.pCallback = hello;

  mystruct.pCallback(&mystruct);
  return EXIT_SUCCESS;

}

Обратите внимание на разницу между именем struct и именем typedef.Да, вы можете сделать их одинаковыми, но многие люди (включая меня) считают, что это сбивает с толку ... Обычная практика состоит в том, чтобы их отличать.

По общему признанию, диагностика GCC здесь была более чем странной.*

...