C ++ satır içi, C satır içi öğesinden tamamen farklıdır .
#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;
}
inlinekendi başına derleyici, montajcı ve bağlayıcıyı etkiler. Derleyiciye, çeviri biriminde kullanılıyorsa bu işlev / veri için yalnızca bir sembol yandığını söyleyen bir direktiftir ve eğer öyleyse, sınıf yöntemleri gibi, montajcıya bunları bölüme .section .text.c::function(),"axG",@progbits,c::function(),comdatveya .section .bss.i,"awG",@nobits,i,comdatveri için saklamasını söyleyin .
Bunu takip eder .section name, "flags"MG, @type, entsize, GroupName[, linkage]. Örneğin, bölüm adı .text.c::function(). axGbölümün ayrılabilir, yürütülebilir ve bir grupta olduğu anlamına gelir, yani bir grup adı belirtilecektir (ve M bayrağı yoktur, bu nedenle entsize belirtilmez); @progbitsbölümün veri içerdiği ve boş olmadığı anlamına gelir; c::function()grup adı ve grubun sahip olduğucomdatbağlantı, tüm nesne dosyalarında, comdat ile etiketlenen bu grup adıyla karşılaşılan tüm bölümlerin 1 dışında son yürütülebilir dosyadan kaldırılacağı anlamına gelir; yani derleyici, çeviri biriminde yalnızca bir tanım olduğundan emin olur ve ardından derleyiciye koymasını söyler bunu nesne dosyasında kendi grubunda (1 grupta 1 bölüm) ve daha sonra bağlayıcı herhangi bir nesne dosyası aynı ada sahip bir gruba sahipse, son .exe'de yalnızca bir tane içerdiğinden emin olur. Arasındaki fark inlineve kullanmayan inlinedüzenli yer etmedi, çünkü bağlayıcı assembler için ve sonuç olarak artık görünür .dataya .textdolayı direktiflerine çevirici tarafından vb.
static inlinebir sınıfta bunun bir tür tanımı ve bildirim değil (statik elemanın sınıfta tanımlanmasına izin verir) anlamına gelir ve satır içi olmasını sağlar; şimdi yukarıdaki gibi davranıyor.
static inlinedosya kapsamı yalnızca derleyiciyi etkiler. Derleyici için şu anlama gelir: bu işlev / veri için yalnızca çeviri biriminde kullanılıyorsa ve bunu düzenli bir statik sembol olarak (eğer .globl yönergesi olmadan in.text /.data depola) yapın. Montajcı için şimdi staticve arasında bir fark yoktur.static inline
extern inlinebu sembolü çeviri biriminde tanımlamanız veya derleyici hatası atmanız gerektiği anlamına gelen bir bildirimdir; daha sonra tanımlanan düzenli olarak muamele eğer inlineve çevirici ve ilintileyici orada arasında hiçbir fark olacak extern inlineve inlinebu sadece bir derleyici bekçi yani.
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
Hata çizgisi olmadan yukarıdakilerin tümü çöker inline int i[5]. Açıkçası eğer extern inline int i[] = {5};o zaman externatama yoluyla açık tanımına bağlı olarak göz ardı edilecektir.
inlineBir ad üzerine, bkz bu ve bu