Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/08/2019, à 08: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;
}
  1. quelqu'un comprend-il ce libc_hidden_def et son rôle ? est-ce une fonction ??

  2. est-ce normal d'avoir une définition de fonction (et non pas son prototype) dans un *.h ??

  3. 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 ?)

  4. et (mais c'est un détail), je ne comprends pas le type "__extern_inline"

Merci d'avance et bonne journée smile

D.

Dernière modification par DonutMan75 (Le 28/08/2019, à 16:11)

Hors ligne

#2 Le 28/08/2019, à 09: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

Hors ligne

#3 Le 28/08/2019, à 09: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, à 09:50)

Hors ligne

#4 Le 28/08/2019, à 16:11

DonutMan75

Re : [RESOLU] langage C : libc_hidden_def ??

Hello !
Merci à vous deux pour vos éclaircissements smile
Pas facile de s'y retrouver dans tout ça...

Bonne aprem à tous,
D.

Hors ligne