[C/Linux]implicit declaration of registerrpc

Résolu
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 21 févr. 2008 à 09:04
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 22 févr. 2008 à 14:31
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
22 févr. 2008 à 11:36
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 :)
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
21 févr. 2008 à 11:11
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 févr. 2008 à 17:22
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...
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
21 févr. 2008 à 17:30
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 févr. 2008 à 17:53
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.
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
22 févr. 2008 à 09:10
Il y a une exemple complet ici : http://www.xgarreau.org/forum5/read.php?1,11,22, essaye de le faire marcher.

Cdt      
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 févr. 2008 à 11:02
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);
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 févr. 2008 à 14:31
Vi, je crois pas que j'aurais de meilleur explication...


Merci pour le suivi de dossier.
0
Rejoignez-nous