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;
}
inline
kendi 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(),comdat
veya .section .bss.i,"awG",@nobits,i,comdat
veri 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()
. axG
bö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); @progbits
bölümün veri içerdiği ve boş olmadığı anlamına gelir; c::function()
grup adı ve grubun sahip olduğucomdat
bağ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 inline
ve kullanmayan inline
düzenli yer etmedi, çünkü bağlayıcı assembler için ve sonuç olarak artık görünür .data
ya .text
dolayı direktiflerine çevirici tarafından vb.
static inline
bir 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 inline
dosya 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 static
ve arasında bir fark yoktur.static inline
extern inline
bu 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 inline
ve çevirici ve ilintileyici orada arasında hiçbir fark olacak extern inline
ve inline
bu 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 extern
atama yoluyla açık tanımına bağlı olarak göz ardı edilecektir.
inline
Bir ad üzerine, bkz bu ve bu