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;
}
inlineaffecte à 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(),comdatou .section .bss.i,"awG",@nobits,i,comdatpour 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(). axGsignifie 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); @progbitssignifie que la section contient des données et n'est pas vide; c::function()est le nom du groupe et le groupe acomdatliaison 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 inlineet ne pas utiliser inlineest maintenant visible par l'assembleur et par conséquent l'éditeur de liens, car il n'est pas stocké dans le régulier .dataou .textetc. par l'assembleur en raison de leurs directives.
static inlinedans 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 staticetstatic inline
extern inlineest 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 inlineet pour l'assembleur et l'éditeur de liens, il n'y aura pas de différence entre extern inlineet 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 externserait ignorée en raison de la définition explicite par voie de cession.
inlinesur un espace de noms, voyez ceci et cela