Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Déclaration extern

4 views
Skip to first unread message

Thomas Nemeth

unread,
Dec 17, 2023, 11:12:07 AM12/17/23
to
Bonjour à tous.

Récemment je suis tombé sur une remarque d'un collègue à propos
du mot-clé "extern". Il me soutenait qu'il faut le mettre sur
les déclarations de fonctions exportées dans les headers. ie:

Fichier .c :

int toto(void)
{
return 0;
}

Fichier .h :

extern int toto(void);


Ayant conscience de la limite de mes connaissances relatives à
ce mot-clé, je suis allé piocher dans la doc de GCC (puisqu'on
compile avec)...

En effet je préfère me baser sur une documentation officielle
plutôt que sur stack overflow, bien que je lui reconnaisse une
certaine utilité. Évidemment beaucoup de résultats de recherche
correspondaient à mon usage habituel : déclarer une variable
non statique -- et initialisée -- dans un module, et la déclarer
extern dans les autres modules.

Donc la doc de gcc(1) dit :
« [...]
extern is useful for declaring variables that you want to be
visible to all source files that are linked into your project.
[...] »

Nulle part il n'est question de fonction.

Cependant, dans la section "Scope", il est dit :
« [...]
A declared object can be visible only within a particular
function, or within a particular file, or may be visible to
an entire set of files by way of including header files and
using extern declarations.

Unless explicitly stated otherwise, declarations made at the
top-level of a file (i.e., not within a function) are visible
to the entire file, including from within functions, but are
not visible outside of the file.
[...] »

De plus la documentation pour les fonctions statiques indique :
« You can define a function to be static if you want it to be
callable only within the source file where it is defined: [...]
Functions which are defined in this way are said to have static
linkage. [...] »


Du coup je ne suis pas beaucoup plus avancé. Alors je suis allé
regarder du côté des includes de la libc... et en effet il y a
plein de fonctions déclarées comme "extern".


L'un de vous aurait-il un pointeur vers une description réelle
de "extern" ?
Est-ce un mot-clé dont l'utilisation est compilo-dépendante ?



(1) https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html

Thomas.
--
BOFH excuse #26:
First Saturday after first full moon in Winter.

Olivier Miakinen

unread,
Dec 17, 2023, 3:57:57 PM12/17/23
to
Bonjour,

Le 17/12/2023 17:12, Thomas Nemeth a écrit :
>
> Récemment je suis tombé sur une remarque d'un collègue à propos
> du mot-clé "extern". Il me soutenait qu'il faut le mettre sur
> les déclarations de fonctions exportées dans les headers. ie:
>
> Fichier .c :
>
> int toto(void)
> {
> return 0;
> }
>
> Fichier .h :
>
> extern int toto(void);

Je n'ai malheureusement pas de pointeur vers une doc officielle à te donner,
alors si c'est ça que tu cherches je suis désolé de ne pas pouvoir t'aider.

Je peux malgré tout donner mon avis, basé à la fois sur la logique et sur ma
propre pratique du langage C.

Le mot-clé extern est utile pour une variable, car selon qu'on la déclare ou
non extern le compilateur saura s'il doit réserver de la mémoire (sans extern)
ou s'il sait que la mémoire sera réservée ailleurs et que ce sera résolu par
l'éditeur de lien (avec extern).

Mais dans le cas d'une fonction, vu que la déclaration dans un .h ne peut pas
réserver de la mémoire pour du code qui n'est pas défini dans ce même .h,
le mot-clé extern est optionnel car implicite.

En résumé : tu fais bien comme tu veux. Soit tu mets ce mot-clé extern par
souci esthétique, pour faire avec les fonctions comme avec les variables,
soit tu ne le mets pas parce qu'il ne sert à rien.



--
Olivier Miakinen

Olivier Miakinen

unread,
Dec 17, 2023, 4:16:53 PM12/17/23
to
Le 17/12/2023 21:57, je répondais à Thomas Nemeth :
>
> Je n'ai malheureusement pas de pointeur vers une doc officielle à te donner,
> alors si c'est ça que tu cherches je suis désolé de ne pas pouvoir t'aider.

J'ai trouvé la doc de référence. Ils ne parlent absolument pas du mot-clé
extern dans les déclarations de fonctions, et celui-ci n'est utilisé dans
aucun exemple :

<https://en.cppreference.com/w/c/language/function_declaration>

--
Olivier Miakinen

Thierry Pinelli

unread,
Dec 18, 2023, 4:38:06 AM12/18/23
to
bonjour,

par contre ici-même on en parle :

https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/


Thierry Pinelli

unread,
Dec 18, 2023, 4:45:54 AM12/18/23
to
Le 17/12/2023 à 22:16, Olivier Miakinen a écrit :
et d'ajouter :

la référence, c'est le KR


Thomas Nemeth

unread,
Dec 18, 2023, 8:25:58 AM12/18/23
to
Le 18-12-2023, Thierry Pinelli <festive...@gmail.com> a écrit :
> Le 17/12/2023 à 22:16, Olivier Miakinen a écrit :
>> Le 17/12/2023 21:57, je répondais à Thomas Nemeth :
>>>
>>> Je n'ai malheureusement pas de pointeur vers une doc officielle à te donner,
>>> alors si c'est ça que tu cherches je suis désolé de ne pas pouvoir t'aider.
>>
>> J'ai trouvé la doc de référence. Ils ne parlent absolument pas du mot-clé
>> extern dans les déclarations de fonctions, et celui-ci n'est utilisé dans
>> aucun exemple :
>>
>> <https://en.cppreference.com/w/c/language/function_declaration>

En effet. Par contre en suivant le lien "external linkage", on tombe
sur : https://en.cppreference.com/w/c/language/storage_duration
qui dit

« The extern specifier specifies static storage duration (unless
combined with _Thread_local(until C23)thread_local(since C23))
(since C11) and external linkage. It can be used with function
and object declarations in both file and block scope (excluding
function parameter lists). »

Mais est ajoutée la précision :

« If no storage-class specifier is provided, the defaults are:
extern for all functions [...] »


> par contre ici-même on en parle :
>
> https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

Qui précise : « It turns out that when a function is declared or
defined, the extern keyword is implicitly assumed. »

Merci à tous.


Thomas.
--
BOFH excuse #28:
CPU radiator broken.
0 new messages