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

[C99] gcc et fonctions 'inline'

33 réponses
Avatar
JKB
Bonjour à tous,

Je suis en train de modifier les sources d'un programme pour le
rendre compilable par un compilo C99 (une en-tête moisie de Solaris
demande C99 dès que _POSIX_C_SOURCE est défini avec une valeur
supérieure ou égale à 200112L, contrairement aux autres systèmes que
j'ai sous la main). J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.

En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined
rpl.conv.h:2809: warning: inline function ‘librpl_read_atomic’ declared
but never defined
rpl.conv.h:2589: warning: inline function ‘librpl_scrutation_injection’
declared but never defined
rpl.conv.h:2477: warning: inline function ‘librpl_analyse_instruction’
declared but never defined

et j'en passe qui me polluent allègrement les logs de compilation.
Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.

Je viens de lire (plusieurs fois) la doc de gcc et je n'ai pas
trouvé d'option empêchant l'affichage de ce genre de warning.
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...

Une idée ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

10 réponses

1 2 3 4
Avatar
Kojak
Le Mon, 10 May 2010 08:28:40 +0000 (UTC),
JKB a écrit :

[...]
rpl.conv.h:2811: warning: inline function
‘librpl_write_atomic’ declared but never defined
[...]
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...



Salut,

Je n'ai pas connaissance d'options de GCC pour supprimer ce type
d'avertissement. Par contre, je ne sais pas si c'est la bonne idée
que tu attends, mais si tu déportes la définition de tes fonc tions
dans le fichier contenant leurs déclarations «inline», tu ne devrais
plus avoir de problème, hormis un peu plus de boulot... ;-)

Cordialement,

--
Jacques.
Avatar
JKB
Le 10-05-2010, ? propos de
Re: [C99] gcc et fonctions 'inline',
Kojak ?crivait dans fr.comp.lang.c :
Le Mon, 10 May 2010 08:28:40 +0000 (UTC),
JKB a écrit :

[...]
rpl.conv.h:2811: warning: inline function
‘librpl_write_atomic’ declared but never defined
[...]
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...



Salut,

Je n'ai pas connaissance d'options de GCC pour supprimer ce type
d'avertissement. Par contre, je ne sais pas si c'est la bonne idée
que tu attends, mais si tu déportes la définition de tes fonctions
dans le fichier contenant leurs déclarations «inline», tu ne devrais
plus avoir de problème, hormis un peu plus de boulot... ;-)



Je sais, mais dans mon cas, ce n'est vraiment pas simple...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Jean-Marc Bourguet
JKB writes:

Bonjour à tous,

Je suis en train de modifier les sources d'un programme pour le
rendre compilable par un compilo C99 (une en-tête moisie de Solaris
demande C99 dès que _POSIX_C_SOURCE est défini avec une valeur
supérieure ou égale à 200112L, contrairement aux autres s ystèmes que
j'ai sous la main). J'ai eu quelques problèmes avec 'inline' mais l à, ça
compile correctement.

En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic⠀™ declared
but never defined
rpl.conv.h:2809: warning: inline function ‘librpl_read_atomic⠀™ declared
but never defined
rpl.conv.h:2589: warning: inline function ‘librpl_scrutation_inje ction’
declared but never defined
rpl.conv.h:2477: warning: inline function ‘librpl_analyse_instruc tion’
declared but never defined

et j'en passe qui me polluent allègrement les logs de compilation.
Ça ne correspond pas à une erreur, j'ai un fichier d'en-tà ªte qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.

Je viens de lire (plusieurs fois) la doc de gcc et je n'ai pas
trouvé d'option empêchant l'affichage de ce genre de warning.
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...

Une idée ?



En C99, inline implique que la fonction doit etre implementee dans le
fichier. Si tu ajoutes -pedantic-errors, tu devrais te taper une erreur a
la place du warning.

Pour ceux qui veulent une reference: 6.7.4/6 (c'est moi qui souligne avec
** la partie pertinente)

Any function with internal linkage can be an inline function. For a
function with external linkage, the following restrictions apply: *If a
function is declared with an inline function specifier, then it shall also
be defined in the same translation unit*. If all of the file scope
declarations for a function in a translation unit include the inline
function specifier without extern, then the definition in that translation
unit is an inline definition. An inline definition does not provide an
external definition for the function, and does not forbid an external
definition in another translation unit. An inline definition provides an
alternative to an external definition, which a translator may use to
implement any call to the function in the same translation unit. It is
unspecified whether a call to the function uses the inline definition or
the external definition.

(Pour ceux que ca interessent, il y a des differences entre le inline de C
et celui de C++).

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Richard
Le 10/05/2010 10:28, JKB a écrit :
Bonjour à tous,

Je suis en train de modifier les sources d'un programme pour le
rendre compilable par un compilo C99



Par curiosité, quelle fonctionnalité présente dans C89 est manquante
dans C99 pour poser problème ?

(une en-tête moisie de Solaris
demande C99 dès que _POSIX_C_SOURCE est défini avec une valeur
supérieure ou égale à 200112L, contrairement aux autres systèmes que
j'ai sous la main). J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.

En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined
rpl.conv.h:2809: warning: inline function ‘librpl_read_atomic’ declared
but never defined
rpl.conv.h:2589: warning: inline function ‘librpl_scrutation_injection’
declared but never defined
rpl.conv.h:2477: warning: inline function ‘librpl_analyse_instruction’
declared but never defined

et j'en passe qui me polluent allègrement les logs de compilation.
Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.

Je viens de lire (plusieurs fois) la doc de gcc et je n'ai pas
trouvé d'option empêchant l'affichage de ce genre de warning.
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...

Une idée ?



Trois solutions (identiques dans leur effet) :
1) déclarer les fonctions sans inline.
2) déclarer les fonctions avec extern inline.
3) déclarer les fonctions avec extern (sans inline).

Si je comprends bien la norme C99, déclarer une fonction inline (sans
extern) implique que la définition de la fonction sera présente dans
l'unité de traduction.

--
Richard
Avatar
JKB
Le 10-05-2010, ? propos de
Re: [C99] gcc et fonctions 'inline',
Richard ?crivait dans fr.comp.lang.c :
Le 10/05/2010 10:28, JKB a écrit :
Bonjour à tous,

Je suis en train de modifier les sources d'un programme pour le
rendre compilable par un compilo C99



Par curiosité, quelle fonctionnalité présente dans C89 est manquante
dans C99 pour poser problème ?

(une en-tête moisie de Solaris
demande C99 dès que _POSIX_C_SOURCE est défini avec une valeur
supérieure ou égale à 200112L, contrairement aux autres systèmes que
j'ai sous la main). J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.

En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined
rpl.conv.h:2809: warning: inline function ‘librpl_read_atomic’ declared
but never defined
rpl.conv.h:2589: warning: inline function ‘librpl_scrutation_injection’
declared but never defined
rpl.conv.h:2477: warning: inline function ‘librpl_analyse_instruction’
declared but never defined

et j'en passe qui me polluent allègrement les logs de compilation.
Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.

Je viens de lire (plusieurs fois) la doc de gcc et je n'ai pas
trouvé d'option empêchant l'affichage de ce genre de warning.
J'aimerais autant ne pas voir ces warnins qui ne sont pas des
erreurs pour mieux voir ce qui pourrait poser problème...

Une idée ?



Trois solutions (identiques dans leur effet) :
1) déclarer les fonctions sans inline.
2) déclarer les fonctions avec extern inline.
3) déclarer les fonctions avec extern (sans inline).



Dans mes .h, les fonctions sont déclarées comme

inline type fonction();

Les corps des fonctions sont

extern inline type fonction()
{
}

Ajouter extern au prototype ne résout rien. J'aimerais aussi garder
la directive inline. Je suppose que si je vire le inline des
fichiers .h, je n'aurai plus le warning, mais le résultat ne sera
plus le même.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Antoine Leca
JKB écrivit :
une en-tête moisie de Solaris demande C99 dès que _POSIX_C_SOURCE
est défini avec une valeur supérieure ou égale à 200112L,



Cela paraît sain, si tu donnes cette valeur c'est que tu prétends
utiliser la norme Posix de 2001, qui sous-entend l'utilisation d'un
compilo C99...

contrairement aux autres systèmes que j'ai sous la main).



... qui n'ont pas l'air donc très conformes (ou alors je n'ai pas tout
compris de tes explications).


J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.



Mmmm, j'ai pas totalement l'impression que ce soit le cas...


En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined



Bon. Et que penses-tu de définir (dans l'entête <rpl.conv.h> en
question, ou dans un autre visible) la dite fonction ?

Autre solution, tu vires le qualificateur inline devant cette
déclaration ligne 2811, si tu considères que cette fonction n'a pas à
être incorporée en ligne.


Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.



Si tu colles le source de toutes tes fonctions à incorporer en ligne, le
compilateur ne t'en voudra pas, et ne rajoutera rien de plus à ton
programme si tu ne t'en sers pas ; la seule différence, c'est que le
temps de compilation sera légèrement plus long du fait de l'analyse
lexicale des dites fonctions.


Antoine
Avatar
JKB
Le 10-05-2010, ? propos de
Re: [C99] gcc et fonctions 'inline',
Antoine Leca ?crivait dans fr.comp.lang.c :
JKB écrivit :
une en-tête moisie de Solaris demande C99 dès que _POSIX_C_SOURCE
est défini avec une valeur supérieure ou égale à 200112L,



Cela paraît sain, si tu donnes cette valeur c'est que tu prétends
utiliser la norme Posix de 2001, qui sous-entend l'utilisation d'un
compilo C99...



Disons que c'est un peu plus compliqué que ça. Pour contourner un
problème de #define dans un fichier système de Mac OS X, j'ai dû
passer cette valeur de 1995quelque chose à 2001. Le code source est
du C89 (je n'a jamais ressenti la nécessité de passer à C99, c'est
peut-être un tort...).

contrairement aux autres systèmes que j'ai sous la main).



... qui n'ont pas l'air donc très conformes (ou alors je n'ai pas tout
compris de tes explications).



Possible.

J'ai eu quelques problèmes avec 'inline' mais là, ça
compile correctement.



Mmmm, j'ai pas totalement l'impression que ce soit le cas...


En revanche, j'ai un tas de warnings du type :

rpl.conv.h:2811: warning: inline function ‘librpl_write_atomic’ declared
but never defined



Bon. Et que penses-tu de définir (dans l'entête <rpl.conv.h> en
question, ou dans un autre visible) la dite fonction ?

Autre solution, tu vires le qualificateur inline devant cette
déclaration ligne 2811, si tu considères que cette fonction n'a pas à
être incorporée en ligne.



Disons que quitte à utiliser C99, autant virer certaines macros pas
trop propres^W^W^Wcarrément dégueulasses par des inlines ;-)

Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.



Si tu colles le source de toutes tes fonctions à incorporer en ligne, le
compilateur ne t'en voudra pas, et ne rajoutera rien de plus à ton
programme si tu ne t'en sers pas ; la seule différence, c'est que le
temps de compilation sera légèrement plus long du fait de l'analyse
lexicale des dites fonctions.



Donc si je comprends bien, il faudrait que je colle toutes les
fonctions 'inlinées' dans un fichier spécifique, sous forme 'static'
et que j'inclus ce fichier comme un fichier d'en-tête à tous mes
fichiers .c, c'est bien ça ?

La question est sans doute triviale...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
espie
In article <hs9172$jkd$,
Antoine Leca wrote:
JKB écrivit :
une en-tête moisie de Solaris demande C99 dès que _POSIX_C_SOURCE
est défini avec une valeur supérieure ou égale à 200112L,



Cela paraît sain, si tu donnes cette valeur c'est que tu prétends
utiliser la norme Posix de 2001, qui sous-entend l'utilisation d'un
compilo C99...



Ces defines, ca a toujours ete la merde. Pratiquement personne ne programme
avec une norme precise, et les divers systemes ont toujorus des petites
differences d'interpretation de l'un a l'autre.

Du coup, on se retrouve a dire qu'on est posix, mais pas xdg-chose, et
tutti-quanti, et generalement ca foire dans des gros projets sur des entetes
qui ne sont pas compatibles avec eux-memes (ou presque).

Et je pourrais un peu raler aussi sur le comite de normalisation C qui a
fait C99 (et sa future suite) un peu tout seul dans son coin, en ignorant
superbement les magnifiques problemes de compatibilite que ca allait poser
avec C++...

Bref, le principal objectif de ces defines, c'est de dedouaner ton vendeur
de tous les problemes que tu vas avoir en compilant du vrai code, qui n'est
presque jamais totalement standard (sauf si bien sur c'est toi qui as tout
ecrit)...
Avatar
Marc
JKB wrote:

Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.



Ça sert à quoi une déclaration de fonction inline sans la définition
correspondante ?
Avatar
JKB
Le 10-05-2010, ? propos de
Re: [C99] gcc et fonctions 'inline',
Marc ?crivait dans fr.comp.lang.c :
JKB wrote:

Ça ne correspond pas à une erreur, j'ai un fichier d'en-tête qui
reprend toutes les fonctions 'inlinées', fonctions qui ne sont pas
utilisées dans tous mes fichiers de sources.



Ça sert à quoi une déclaration de fonction inline sans la définition
correspondante ?



À rien, c'est simplement une déclaration dans un fichier d'en-tête
faite à la va-vite.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
1 2 3 4