Kompilator mnie nie rozumie - wskaźnik funkcji w strukturze

0

Witam,

Chcę zrobić strukturę w której będzie wskaźnik do funkcji w której będzie argument o typie wskaźnika do tej właśnie struktury:
Przykładowo taki prosty kodzik:

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

typedef void (*EVENT)(struct tmp_t * tmp);

struct tmp_t{
  EVENT event;
};

int main(){
  
  return 0;
}
 
$ gcc -o main main.c && ./main                                                                       
main.c:4:30: warning: 'struct tmp_t' declared inside parameter list                                                                                
main.c:4:30: warning: its scope is only this definition or declaration, which is probably not what you want  

Jak dogadać się z kompilatorem żeby nie wywalał warningów?

0

Najpierw daj deklarację struktury, potem typedef funkcji. Wszystko powinno być zdeklarowane PRZED użyciem, nawet jeśli użyciem jest kolejna deklaracja.

3

Żeby nie było niedomówień:

#include <stdio.h>
#include <stdlib.h>
 
struct tmp_t;
 
typedef void (*EVENT)(struct tmp_t * tmp);
 
struct tmp_t{
  EVENT event;
};
 
int main(){
 
  return 0;
}
0

No bo używasz argumentu typu który nie jest znany. Wstaw deklaracje zapowiadającą tą strukturę wcześniej, tzn

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

struct tmp_t;
typedef void (*EVENT)(struct tmp_t * tmp);
 
struct tmp_t{
  EVENT event;
};
 
int main(){
 
  return 0;
}

edit: za późno :P

0

Ooo właśnie takie coś ;) rozwiąże to dużo problemów gdzie deklaracje potrzebowały się nawzajem ;)

0

@si ale pamiętaj ze to zadziała tylko (!) ze wskaźnikami i z deklaracjami! To znaczy że nie możesz zrobić tak:

struct mojaStruktura;

void funkcja(struct mojaStrukura* ms, int wartosc){
  ms->pole = wartosc
}

ani tak:

struct mojaStruktura1;

struct mojaStruktura2{
  struct mojaStrutkura1 pole;
};

Bo deklaracja zapowiadajaca mówi tylko o tym że "istnieje struktura o takiej nazwie ale nic więcej o niej nie wiadomo"

0
Shalom napisał(a):

@si ale pamiętaj ze to zadziała tylko (!) ze wskaźnikami i z deklaracjami!

I bardzo dobrze, w przeciwnym razie gdyby coś takiego miało działać

struct B;
struct A
{
  int c;
  struct B b;
}

struct B
{
  int d;
  struct A a;
}

to struktury miałyby nieskończony rozmiar ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1