#1 Le 28/08/2019, à 07:51
- DonutMan75
[RESOLU] langage C : libc_hidden_def ??
Bonjour à tous,
par curiosité j'ai souhaité regarder comment la fonction bsearch de la glibc fonctionnait.
Pour rappel, cette fonction permet de faire une recherche dichotomique dans une table ordonnée et fait partie de la bibliothèque stdlib.
J'ai récupéré les sources ici : http://ftp.gnu.org/gnu/glibc/
Et voici le contenu de bsearch.c :
/* Copyright (C) 1991-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
(...)
<http://www.gnu.org/licenses/>. */
#include <stdlib.h>
#undef __extern_inline
#define __extern_inline /* Empty, so we get a normal definition. */
#include <bits/stdlib-bsearch.h>
libc_hidden_def (bsearch)
Du coup, je suis allé regarder bits/stdlib-bsearch.h et voici son contenu :
/* Perform binary search - inline version.
Copyright (C) 1991-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
(...)
<http://www.gnu.org/licenses/>. */
__extern_inline void *
bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar)
{
size_t __l, __u, __idx;
const void *__p;
int __comparison;
__l = 0;
__u = __nmemb;
while (__l < __u)
{
__idx = (__l + __u) / 2;
__p = (void *) (((const char *) __base) + (__idx * __size));
__comparison = (*__compar) (__key, __p);
if (__comparison < 0)
__u = __idx;
else if (__comparison > 0)
__l = __idx + 1;
else
return (void *) __p;
}
return NULL;
}
quelqu'un comprend-il ce libc_hidden_def et son rôle ? est-ce une fonction ??
est-ce normal d'avoir une définition de fonction (et non pas son prototype) dans un *.h ??
les variables sont toutes préfixées par '__' pour quelle raison ? (il ne risque pas d'y avoir de collision avec des variables définies par l'utilisateur non ?)
et (mais c'est un détail), je ne comprends pas le type "__extern_inline"
Merci d'avance et bonne journée
D.
Dernière modification par DonutMan75 (Le 28/08/2019, à 15:11)
Hors ligne
#2 Le 28/08/2019, à 08:45
- Vobul
Re : [RESOLU] langage C : libc_hidden_def ??
Pour 1 :
https://stackoverflow.com/questions/213 … trspn-mean
https://github.com/lattera/glibc/blob/m … ols.h#L443
http://www.zlibc.linux.lu/pipermail/zli … 00035.html
From what I've seen, the reason for the problem are the
> libc_hidden_def macros which are now used throughout glibc. Their goal
> apparently is to make sure that libc functions (such as fopen or
> fopen64) only call libc's own functions (such as open), and to
> completely ignore any functions brought by LD_PRELOADed objects.
Pour 2 : http://hanxue-it.blogspot.com/2014/04/w … de-in.html
Pour 3 : https://stackoverflow.com/questions/144 … -mean-in-c
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
Hors ligne
#3 Le 28/08/2019, à 08:47
- NicoApi73
Re : [RESOLU] langage C : libc_hidden_def ??
Bonjour,
1) Visiblement c'est une macro
2) Il est possible de faire une définition en ligne (donc au moment de la déclaration).
4)
#define __extern_inline /* Empty, so we get a normal definition. */
Ici, c'est remplacé par du vide
Je ne sais pas répondre au #3, seulement donner des hypothèses. Merci Vobul
Dernière modification par NicoApi73 (Le 28/08/2019, à 08:50)
Hors ligne
#4 Le 28/08/2019, à 15:11
- DonutMan75
Re : [RESOLU] langage C : libc_hidden_def ??
Hello !
Merci à vous deux pour vos éclaircissements
Pas facile de s'y retrouver dans tout ça...
Bonne aprem à tous,
D.
Hors ligne