Utilisation de extern pour faire référence à l’instanciation d’une fonction inline non statique

Est-il possible de créer un lien avec une fonction inline instanciée non statique en la déclarant extern dans un autre fichier ?:

inline.c:

 inline int foo(void) { return 42; } extern inline int foo(void); 

principal c:

 extern int foo(void); int main(){ return foo(); } 

Empiriquement, $CC main.c inline.c (où CC est gcc , clang ou tcc ) fonctionne. Est-ce un exemple conforme C?

La première question concerne le comportement de extern inline int foo(void); dans la même unité de traduction que la définition apparente en ligne.

Le texte de C17 6.7.4 / 7 est:

Si toutes les déclarations d’étendue de fichier pour une fonction dans une unité de traduction incluent le spécificateur de fonction en inline sans extern , la définition dans cette unité de traduction est une définition en ligne .

La clause “If all …” ne s’applique pas à inline.c , car la deuxième ligne déclare l’identifiant avec extern . Donc, la première ligne est en fait une définition externe , pas une définition en ligne.

Ensuite, en utilisant extern int foo(void); dans l’autre unité de traduction est très bien. foo est une fonction avec une liaison externe qui a une définition externe. Il n’y a pas de règle empêchant cela.


Cela serait également bien si inline.c ne contenait que la première ligne, qui serait une définition inline , et extern inline int foo(void); apparu dans une troisième unité de traduction. foo est toujours une fonction avec un lien externe et ayant une définition externe.

Toute définition en ligne ne concerne que la même unité de traduction que la définition en ligne.