C ++ inline est totalement différent de C inline .
#include <iostream>
extern inline int i[];
int i [5];
struct c {
int function (){return 1;} //implicitly inline
static inline int j = 3; //explicitly inline
};
int main() {
c j;
std::cout << i;
}
inline
affecte à lui seul le compilateur, l'assembleur et l'éditeur de liens. Il s'agit d'une directive adressée au compilateur disant de n'émettre un symbole pour cette fonction / donnée que si elle est utilisée dans l'unité de traduction, et si c'est le cas, alors comme les méthodes de classe, dites à l'assembleur de les stocker dans la section .section .text.c::function(),"axG",@progbits,c::function(),comdat
ou .section .bss.i,"awG",@nobits,i,comdat
pour les données. Les instanciations de modèles vont également dans leurs propres groupes comdat.
Cela suit .section name, "flags"MG, @type, entsize, GroupName[, linkage]
. Par exemple, le nom de la section est .text.c::function()
. axG
signifie que la section est allouable, exécutable et dans un groupe, c'est-à-dire qu'un nom de groupe sera spécifié (et il n'y a pas d'indicateur M, donc aucune dimension ne sera spécifiée); @progbits
signifie que la section contient des données et n'est pas vide; c::function()
est le nom du groupe et le groupe acomdat
liaison signifiant que dans tous les fichiers objets, toutes les sections rencontrées avec ce nom de groupe étiqueté avec comdat seront supprimées de l'exécutable final sauf 1 c'est-à-dire que le compilateur s'assure qu'il n'y a qu'une seule définition dans l'unité de traduction et dit ensuite à l'assembleur de mettre dans son propre groupe dans le fichier objet (1 section dans 1 groupe), puis l'éditeur de liens s'assurera que si des fichiers objet ont un groupe du même nom, n'en incluez qu'un dans le fichier .exe final. La différence entre inline
et ne pas utiliser inline
est maintenant visible par l'assembleur et par conséquent l'éditeur de liens, car il n'est pas stocké dans le régulier .data
ou .text
etc. par l'assembleur en raison de leurs directives.
static inline
dans une classe signifie qu'il s'agit d'une définition de type et non d'une déclaration (permet de définir un membre statique dans la classe) et de le rendre en ligne; il se comporte maintenant comme ci-dessus.
static inline
à la portée du fichier affecte uniquement le compilateur. Cela signifie pour le compilateur: n'émettre un symbole pour cette fonction / donnée que s'il est utilisé dans l'unité de traduction et le faire comme un symbole statique régulier (stocker dans.text /.data sans directive .globl). Pour l'assembleur, il n'y a plus de différence entre static
etstatic inline
extern inline
est une déclaration qui signifie que vous devez définir ce symbole dans l'unité de traduction ou jeter l'erreur du compilateur; s'il est défini, traitez-le comme un normal inline
et pour l'assembleur et l'éditeur de liens, il n'y aura pas de différence entre extern inline
et inline
, il s'agit donc uniquement d'une protection du compilateur.
extern inline int i[];
extern int i[]; //allowed repetition of declaration with incomplete type, inherits inline property
extern int i[5]; //declaration now has complete type
extern int i[5]; //allowed redeclaration if it is the same complete type or has not yet been completed
extern int i[6]; //error, redeclaration with different complete type
int i[5]; //definition, must have complete type and same complete type as the declaration if there is a declaration with a complete type
L'ensemble de ce qui précède sans la ligne d'erreur s'effondre inline int i[5]
. Il est évident que si vous avez extern inline int i[] = {5};
alors extern
serait ignorée en raison de la définition explicite par voie de cession.
inline
sur un espace de noms, voyez ceci et cela