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

Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- - Dernière réponse : cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
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;
}
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
3
Merci
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 :)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_laurent1024
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
0
Merci
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
Commenter la réponse de cs_laurent1024
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
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...
Commenter la réponse de cs_rt15
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
0
Merci
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)
Commenter la réponse de cs_laurent1024
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
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.
Commenter la réponse de cs_rt15
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
0
Merci
Il y a une exemple complet ici : http://www.xgarreau.org/forum5/read.php?1,11,22, essaye de le faire marcher.

Cdt      
Commenter la réponse de cs_laurent1024
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
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);
Commenter la réponse de cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Vi, je crois pas que j'aurais de meilleur explication...


Merci pour le suivi de dossier.
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.