petite les fonctions définies dans les fichiers d'en-tête: en ligne ou statique?
J'ai un certain nombre de petites fonctions qui sont définies dans un .h
fichier. C'est un petit projet (maintenant) et je veux éviter la douleur d'avoir les déclarations et les définitions distinctes, parce qu'ils changent tout le temps. Pour éviter de multiplier les symboles définis, je peux soit avoir static
ou inline
. Ce qui devrait être préféré et pourquoi?
Je sais que c'est en général une mauvaise pratique de définir des fonctions dans les en-têtes. Vous n'avez pas à mentionner que, dans les réponses, cette question est destinée techniquement.
- C'est mal de appliquer en-têtes de, pas à les définir 😉
- L'idée de fichiers d'en-tête C/C++ crée un surcroît de travail pour les développeurs, je ne comprends pas vouloir reproduire les déclarations
- petit en taille de code ou les petites dans ce qu'il fait :D?
- la terminologie C je sais, c'est déclaration et définition.
- Programmation terminologie est de définir et de mettre en œuvre. De toute façon, pas de sueur.
- à DÉFINIR et à mettre en ŒUVRE est la même chose! le reste est à déclarer. 🙂
Vous devez vous connecter pour publier un commentaire.
J'utiliserais
static inline
, maisstatic
pourrait fonctionner tout aussi bien.extern
etextern inline
sont parce que vous obtiendrez plusieurs des définitions externes si l'en-tête est inclus dans plus d'une unité de traduction, de sorte que vous devez considérerstatic
,static inline
etinline
spécification.Heptic correctement dans sa réponse que la plupart des compilateurs de considérer que les fonctions de l'in-lining, indépendamment de savoir si
inline
, déterminée ou non, c'est à dire le principal impact deinline
est son effet sur la liaison.Cependant,
static
définitions ont une liaison interne, donc il n'y a pas beaucoup de différence entrestatic
etstatic inline
; je préfèrestatic inline
pour les définitions de fonctions dans les fichiers d'en-tête uniquement pour des raisons de style (règle de base: fichiers d'en-tête ne doit contenir que desextern
déclarations,static const
les définitions de variables etstatic inline
des définitions de fonction).inline
sansstatic
ouextern
résultats dans un inline définition, dont la norme unis (C99 6.7.4, §6)ie inline définitions devraient toujours être accompagnés par des définitions externes, ce qui n'est pas ce que vous cherchez.
Quelques informations supplémentaires sur les subtilités de la C99 inline sémantique peut être trouvé dans cette réponse, sur la Clang page d'accueil et la C99 Justification (PDF).
Gardez à l'esprit que GCC ne utiliser la sémantique C99 si
-std=c99
ou-std=gnu99
est présent...-std=c99
ou-std=gnu99
est présent...Depuis que la question est sur C (pas C++),
inline
signifie queextern
(ISO9899-1999, 6.7.4(6), par exemple uninline
d'une fonction avec une liaison externe doit être définie dans la même unité de compilation, et une inline définition permet uneextern
définition ailleurs, sans une erreur (ce qui n'est pas forcément une bonne chose, parce que les deux fonctions n'ont pas besoin d'être fonctionnellement équivalent, et il n'est pas précisé par le compilateur utilise à tout moment!).L'éditeur de liens implications donné par Heptic sont nécessaires pour le C++, mais n'est pas requis par C (autant que je puisse en dire). Ils sont nécessairement requis par la "doit avoir la même adresse dans toutes les unités de traduction" clause ISO14882, 7.1.2(4). Je ne suis pas au courant de toute autre clause similaire dans C99.
Cependant, depuis le totalement différents langages C et C++ généralement passer par le même compilateur C/C++ et l'éditeur de liens, cela fonctionne de la même manière pour C, de toute façon.
Donc... pour répondre à votre question? Utilisation
inline
lorsque vous sentez que c'est suffisant. Être conscient des pièges possibles deextern
. Autrement, laissez-vous et faites confiance au compilateur de faire droit.inline
, dans le même sens qu'il n'est pas de droite, ni de tort au sujet, si vous mettez une définition dans un en-tête ou d'une source -- vous pouvez faire un de ces ou les deux, et aucune n'est généralement pas, c'est un choix de conception. Si vous rencontrez un problème avec une double définition (vous êtes généralement droit de vos réserves!) c'est une autre affaire. Il est certainement l'ODR. Mais les en-têtes peuvent être inclus qu'une seule fois (nous ne savons pas), et il est#ifdef
, si rien d'autre, au cas où...gnu_inline
qui change totalement des règles encore une fois.). Bien que cela nécessiterait probablement une autre déclaration extern dans la clause else... pas joli, mais ah bien... À la fin, on a besoin de choisir la seule chose qui sent bon.Je pense que static inline est le chemin à parcourir pour les fonctions que vous voulez en ligne, et seulement statique pour ceux que vous ne voulez pas.
statique se réfère à la visibilité, mais inline est ambigu quant à la visibilité dans la norme (C99). De toute façon, ce n'est pas son but: inline est pour inline fonctions, donc il a un effet secondaire d'une visibilité point de vue vous ne pourriez pas vouloir.