[C/Linux]implicit declaration of registerrpc [Résolu]

Signaler
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Salut,


J'utilise la fonction registerrpc, et lorsque je compile avec les options habituelles (-Wall -ansi -pedantic), j'obtiens le warning suivant :

warning: implicit declaration of function `registerrpc'


Ce warning arrive habituellement quand on a pas déclaré le prototype de la fonction.

Donc qu'on a oublié le .h qui déclare cette fonction.

Le truc, c'est que le .h en question, je le cherche encore...


J'ai cherché dans tout /usr/include sans résultat.

Je songe à déclaré moi même le proto, mais bon ce serait pas top...


Donc voilou, si quelqu'un à une idée, merci.


Un code de test.

Il est incomplet, mais il compile alors qu'il devrait pas : il devrait
faire une erreur too few arguements, mais à la place, il me fait une
implicit declaration.
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <rpc/rpc.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/socket.h>
#include

int main()
{
registerrpc();
return 0;
}

8 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
A mon avis, c'est qu'il y a deux solutions :
soit les gens qui codent en rpc se foutent des warnings,
soit ils compilent sans l'option Wall :)
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
registerrpc a des paramètres
registerrpc(prognum, versnum, procnum, procname, inproc, outproc) (d'apres ton lien)
donc tu ne peux pas appeller ta fonction sans paramètres.

Cdt
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Merci pour cette première réponse.


Vi vi, bien sûr que registerrpc a des paramètres.


J'ai eu la flemme de copier coller tout mon code sur ce site vu que
c'est du rpc et que ça demande pas mal de trucs à droite et à gauche à
mettre dans les paramètres.


Cependant, le code ci-dessus est suffisant pour s'apercevoire qu'il y a un problème :

Il compile avec le warning "implicit declaration", alors qu'il devrait faire une erreur de compilation avec le message "too few arguements".


Bref, le code ci-dessus est suffisant pour constater que registerrpc n'est déclarée nul part...
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
Oui mais le code suivant
int main()
{
fonctionquiexistenulpart();
return 0;
}

risque de provoquer la même erreur. (Désolé je n'ai pas de compilo sous la main pour tester)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Bah ça ça fait ça :

main.c: In function `main':

main.c:7: warning: implicit declaration of function `fonctionquiexistenulpart'

/tmp/ccMW3X20.o(.text+0x1d): In function `main':

: undefined reference to `fonctionquiexistenulpart'

collect2: ld returned 1 exit status


Comme pour registerrpc, il ne trouve pas le proto, et le signal : warning implicit declaration.

Néanmoins, ce n'est qu'un warning à la compile.


Par contre, au link, contrairement à registerrpc, ld ne trouve pas l'implémentation : undefined reference to.

L'edition des liens est donc impossible et on a pas de binaire en sortie.


Si je met un proto de fonctionquiexistenulpart :

void fonctionquiexistenulpart(void * unargument);

J'obtiens :


main.c: In function `main':

main.c:9: error: too few arguments to function `fonctionquiexistenulpart'

Plante à la compilation. Bah vi, il manque des arguments.

Et si j'utilisais un proto sans argument, ça planterais en undefined reference to au link.
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
Il y a une exemple complet ici : http://www.xgarreau.org/forum5/read.php?1,11,22, essaye de le faire marcher.

Cdt      
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
En concaténant calc_h.h et server.c dans un même fichier, avec une compilation avec options -Wall -pedantic, je me bouffe :
main.c:20: warning: return type defaults to `int'
main.c: In function `xdr_varintarr':
main.c:21: warning: pointer targets in passing arg 3 of `xdr_array' differ in signedness
main.c:31:1: warning: C++ style comments are not allowed in ISO C90
main.c:31:1: warning: (this will be reported only once per input file)
main.c: In function `main':
main.c:32: warning: implicit declaration of function `registerrpc'

Bref, la question reste entière : pourquoi diable n'ont ils pas mis le prototype de registerrpc dans rpc.h ou autre ?

J'ai finalement mis le proto dans mon propre code, mais je comprend vraiment pas pourquoi j'aurais à le faire :

typedef char*procname_type();
int registerrpc(u_long prognum, u_long versnum, u_long uprocnum, procname_type procname, xdrproc_t inproc, xdrproc_t outproc);
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Vi, je crois pas que j'aurais de meilleur explication...


Merci pour le suivi de dossier.