Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bibliotheque et fichiers d'en-tete pour l'utilisateur

50 réponses
Avatar
Vincent Lefevre
Bonjour et bonne année,

J'aimerais avoir votre avis sur le point suivant (je n'ai pas vu
d'indications dans les FAQ). Dans la bibliothèque qu'on développe
(MPFR), il y a des fonctions qui ne sont liées aucunement à la
bibliothèque standard et d'autres qui sont liées à certaines choses
de <stdio.h> (par exemple utilisent FILE en argument, parce que ce
sont des fonctions d'entrées/sorties). Y a-t-il une ou des solutions
recommandées concernant les fichiers d'en-tête fournis par la
bibliothèque (pour l'utilisateur de la bibliothèque), avec une
volonté de portabilité?

1) La solution actuelle est celle de GMP, qui est d'essayer de
détecter automatiquement si <stdio.h> a été #inclus avant gmp.h,
auquel cas gmp.h déclare les fonctions d'entrées/sorties. Mais cela
pose notamment deux gros problèmes: comme il n'y a pas de standard
pour cette détection, cela risque d'échouer sur les plateformes non
testées (et cela arrive en pratique) ou à cause de changements futurs
sur les plateformes existantes (cf tous les problèmes qu'a posés le
changement lié au errno dans la glibc); d'autre part, cette méthode
empiète sur le domaine de l'utilisateur. Par exemple, le programme
suivant ne compile pas:

#define H_STDIO 1
#include <gmp.h>

int main(void)
{
return 0;
}

(à noter que H_STDIO ne fait pas partie des macros réservées par GMP,
qui commencent par "GMP_", par convention).

2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
(évidemment, tout cela devant être parfaitement documenté...).

3) Il y a la solution de fournir plusieurs fichiers d'en-tête, e.g.
mpfr.h et mpfrIO.h, où <stdio.h> n'est inclus que dans "mpfrIO.h".
C'est une sorte de (2) modulaire.

Dans les quelques bibliothèques que j'ai regardées (à part GMP), c'est
soit (2) sans la possibilité d'empêcher l'inclusion, soit (3).

Pour info, ma préférence personnelle va pour (3), pour son aspect
modulaire en particulier.

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

10 réponses

1 2 3 4 5
Avatar
DINH Viêt Hoà

2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
(évidemment, tout cela devant être parfaitement documenté...).


J'utilise cette méthode et je me base sur le fait que cet en-tête
(stdio.h par exemple) dispose de méthode pour ne pas s'inclure deux
fois.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan

Avatar
Jean-Marc Bourguet
Vincent Lefevre <vincent+ writes:

Dans les quelques bibliothèques que j'ai regardées (à part GMP), c'est
soit (2) sans la possibilité d'empêcher l'inclusion, soit (3).


Le 1 est une horreur. Je pratique 2 ou 3 suivant les circonstances.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Vincent Lefevre <vincent+ wrote:

J'aimerais avoir votre avis sur le point suivant (je n'ai pas vu
d'indications dans les FAQ). Dans la bibliothèque qu'on développe
(MPFR), il y a des fonctions qui ne sont liées aucunement à la
bibliothèque standard et d'autres qui sont liées à certaines choses
de <stdio.h> (par exemple utilisent FILE en argument, parce que ce
sont des fonctions d'entrées/sorties). Y a-t-il une ou des solutions
recommandées concernant les fichiers d'en-tête fournis par la
bibliothèque (pour l'utilisateur de la bibliothèque), avec une
volonté de portabilité?


Il me semble que ça a déjà été débattu et que le principe d'inclure le header
selon les besoins est la façon la plus simple et la plus évidente de
procéder. Si par malheur une implémentation avait des headers non protégés,
il ne couterait pas bien cher d'ajouter ces protections. En tout cas, je fais
comme ça depuis 10 ans et je n'ai aucun problèmes...

2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
(évidemment, tout cela devant être parfaitement documenté...).


Si le header en question en a besoin, oui, sinon, c'est inutile.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Gabriel Dos Reis
Vincent Lefevre <vincent+ writes:

| 1) La solution actuelle est celle de GMP, qui est d'essayer de
| détecter automatiquement si <stdio.h> a été #inclus avant gmp.h,

C'est une bonne pratique pour créer des situations cauchemardesques
pendant la maintenance ou l'intégration dans des systèmes plus larges.
Dépendre de l'ordre d'inclusion est mauvais pour la santé.

[...]

| 2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
| fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
| macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
| (évidemment, tout cela devant être parfaitement documenté...).

Je n'aime pas particulièrement les inclusions d'entêtes controllées
par les macros. En général, cela veut dire que des tests avec des
outils comme les autotools peuvent données des réponses qui en fait ne
sont pas bonnes. Aussi elle ne marche pas bien avec l'idiome

<compiler> -DMACRO=VALUE file.c ....

Je conseillerais d'inclure systématiquement -- et puisque nous sommes
en C, de le documenter.

| 3) Il y a la solution de fournir plusieurs fichiers d'en-tête, e.g.
| mpfr.h et mpfrIO.h, où <stdio.h> n'est inclus que dans "mpfrIO.h".
| C'est une sorte de (2) modulaire.

À la longue, ceci pose aussi des problèmes de maintenance.

-- Gaby
Avatar
Laurent Deniau
Vincent Lefevre wrote:
Bonjour et bonne année,


Pareillement.

J'aimerais avoir votre avis sur le point suivant (je n'ai pas vu


[...]

2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
(évidemment, tout cela devant être parfaitement documenté...).


C'est la solution que j'utilise et que je consisdere comme etant la
moins mauvaise (et de loin) pour cause de flexibilite. Je fourni un
config.h dans lequel toutes les macros sont definies et commentees.

Cela permet si besoin est de faire du code conditionnel, de demander le
path d'un include a l'installateur, de configurer des niveaux de
check/debug, etc... de maniere tres simple a quiconque connait un peu le
C. Les autotools sont trop compliques et pas assez repandus pour un
utilisateur lambda comme moi.

Si en plus on veut exporter certains settings du config.h dans les
Makefiles, un petit script perl (ou awk) permet de le faire aisement.

3) Il y a la solution de fournir plusieurs fichiers d'en-tête, e.g.
mpfr.h et mpfrIO.h, où <stdio.h> n'est inclus que dans "mpfrIO.h".
C'est une sorte de (2) modulaire.

Pour info, ma préférence personnelle va pour (3), pour son aspect
modulaire en particulier.


3) necessite de modifier les sources si on change d'avis et donc de
connaitre les implications de ces changements.

2) est au moins aussi modulaire/flexible et pose moins de probleme de
maintenance a terme que 3) si on centralise les configurations globales
(e.g. config.h), les configurations locales etant a proscrire a mon avis.

a+, ld.

Avatar
Bertrand Mollinier Toublet
Vincent Lefevre wrote:

2) Il y a la solution d'inclure systématiquement <stdio.h> dans le
fichier d'en-tête qu'on fournit (mpfr.h), éventuellement sauf si telle
macro, e.g. MPFR_NO_STDIO, est définie auparavant par l'utilisateur
(évidemment, tout cela devant être parfaitement documenté...).

3) Il y a la solution de fournir plusieurs fichiers d'en-tête, e.g.
mpfr.h et mpfrIO.h, où <stdio.h> n'est inclus que dans "mpfrIO.h".
C'est une sorte de (2) modulaire.



Ca doit etre le manque d'experience, mais je n'ai jamais ressenti le
besoin de *ne pas* include un fichier d'entete. C'est pour te proteger
contre un entete mal foutu qui ne gere pas les inclusions multiples ?

--
Bertrand Mollinier Toublet
- Le top-posting.
- Quelle est la pratique la plus chiante sur Usenet ?

Avatar
DINH Viêt Hoà

C'est pour te proteger
contre un entete mal foutu qui ne gere pas les inclusions multiples ?


précisemment.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', DINH =?iso-8859-15?Q?Viêt_Hoà?=
wrote:

C'est pour te proteger
contre un entete mal foutu qui ne gere pas les inclusions multiples ?


précisemment.


Dans ce cas, il suffit de le modifier et l'affaire est reglée.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
DINH Viêt Hoà

In 'fr.comp.lang.c', DINH =?iso-8859-15?Q?Viêt_Hoà?=
wrote:

C'est pour te proteger
contre un entete mal foutu qui ne gere pas les inclusions multiples ?


précisemment.


Dans ce cas, il suffit de le modifier et l'affaire est reglée.


Heu ... ben dans un projet distribué, ce n'est pas si évident que ça de
modifier l'en-tête mal foutu vu que ce ne sera pas forcément le même
partout mais il est clair que c'est aux gens à qui appartiennent les
en-têtes de corriger ce problème.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan



Avatar
Gabriel Dos Reis
Bertrand Mollinier Toublet writes:

| Ca doit etre le manque d'experience, mais je n'ai jamais ressenti le
| besoin de *ne pas* include un fichier d'entete.

Amen.

| C'est pour te proteger
| contre un entete mal foutu qui ne gere pas les inclusions multiples ?

Il y a pas de programmeurs C qui pensent que si leurs voisins agissent
des porcs alors ils peuvent faire comme lui.

-- Gaby
1 2 3 4 5