C typedef: le paramètre est de type incomplet

GCC 3.4.5 (version MinGW) génère un avertissement: le paramètre est de type incomplet pour la ligne 2 du code C suivant:

struct s; typedef void (* func_t)(struct s _this); struct s { func_t method; int dummy_member; }; 

Existe-t-il un moyen de résoudre ce problème (ou au moins de cacher l’avertissement) sans modifier la signature de l’argument de méthode en (struct s *)?

Remarque:
Pourquoi quelque chose comme ceci serait utile: Je bricole actuellement avec un framework orienté object; “méthode” est une entrée dans une table de répartition et, en raison de la conception particulière du cadre, il est logique de passer “_this” par valeur et non par référence (comme cela se fait habituellement) …

Vous ne pouvez pas faire cela facilement – selon la norme C99 , Section 6.7.5.3, paragraphe 4:

Après ajustement, les parameters d’une liste de types de parameters dans un déclarateur de fonction faisant partie d’une définition de cette fonction ne doivent pas avoir un type incomplet.

Par conséquent, vous avez le choix entre que la fonction prenne un pointeur sur la structure ou sur une fonction d’un type légèrement différent, telle qu’une fonction prenant des parameters non spécifiés:

 typedef void (* func_t)(struct s*); // Pointer to struct typedef void (* func_t)(void *); // Eww - this is inferior to above option in every way typedef void (* func_t)(); // Unspecified parameters 

Passer à GCC 4 semble fonctionner normalement. MinGW version 4.3.0: http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=241304&release_id=596917

Cacher les avertissements est généralement assez facile – il suffit de regarder l’aide de votre compilateur.

http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/gcc/index.html#//apple_ref/doc/uid/TP40001838

Notez que la suppression des avertissements n’est généralement pas une solution que je préconiserais.

L’avertissement semble être un bogue de la version actuelle de gcc de MinGW. Contrairement à ce qu’Adam a dit, il est valide C99 – section 6.7.5.3, le paragraphe 12 l’autorise explicitement:

Si le déclarateur de fonction ne fait pas partie d’une définition de cette fonction, les parameters peuvent avoir un type incomplet et utiliser la notation [*] dans leurs séquences de spécificateurs de déclarateur pour spécifier les types de tableau de longueur variable.

Il semble n’y avoir aucun moyen d’ordonner à (cette version de) gcc de ne pas imprimer cet avertissement – du moins, je ne pouvais pas trouver un commutateur qui fonctionnait – donc je l’ignore pour le moment.

Vous voulez l’appeler avec un pointeur de fonction. Pourquoi ne pas utiliser un pointeur vide à la place?

 typedef void (*func_t)(void*); 

Vous POUVEZ peut-être également passer un pointeur de fonction faiblement typé; Je n’ai pas de compilateur sous la main.

 typedef void (*func_t)(void (*)());