C ++ แบบอินไลน์จะแตกต่างไปC แบบอินไลน์
#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ด้วยตัวของมันเองจะมีผลกับคอมไพเลอร์แอสเซมเบลอร์และลิงเกอร์ มันเป็นคำสั่งให้คอมไพเลอร์พูดเพียงปล่อยสัญลักษณ์สำหรับฟังก์ชั่น / ข้อมูลนี้ถ้ามันถูกใช้ในหน่วยการแปลและถ้าเป็นเช่นนั้นเช่นเดียวกับวิธีการเรียนบอกผู้ประกอบเพื่อเก็บไว้ในส่วน.section .text.c::function(),"axG",@progbits,c::function(),comdatหรือ.section .bss.i,"awG",@nobits,i,comdatข้อมูล
สิ่งต่อไป.section name, "flags"MG, @type, entsize, GroupName[, linkage]นี้ .text.c::function()ยกตัวอย่างเช่นชื่อส่วนคือ axGหมายถึงส่วนที่สามารถปันส่วนใช้งานได้และในกลุ่มคือชื่อกลุ่มจะถูกระบุ (และไม่มีแฟล็ก M เพื่อไม่ให้ระบุ entsize); @progbitsหมายถึงส่วนที่มีข้อมูลและไม่ว่างเปล่า c::function()เป็นชื่อกลุ่มและกลุ่มมีcomdatการเชื่อมโยงหมายถึงว่าในทุกวัตถุไฟล์ทุกส่วนที่พบกับชื่อกลุ่มนี้ที่ติดแท็กด้วย comdat จะถูกลบออกจากการปฏิบัติการขั้นสุดท้ายยกเว้น 1 เช่นคอมไพเลอร์ทำให้แน่ใจว่ามีเพียงหนึ่งคำจำกัดความในหน่วยการแปลแล้วบอกผู้ประกอบ มันอยู่ในกลุ่มของตัวเองในไฟล์วัตถุ (1 ส่วนใน 1 กลุ่ม) จากนั้นตัวเชื่อมโยงจะตรวจสอบให้แน่ใจว่าหากไฟล์วัตถุใด ๆ มีกลุ่มที่มีชื่อเหมือนกันให้รวมเพียงหนึ่งไฟล์ใน. exe ขั้นสุดท้าย ตอนนี้ความแตกต่างระหว่างinlineและไม่ได้ใช้งานinlineจะปรากฏแก่แอสเซมเบลอร์และเป็นผลให้ linker เพราะมันไม่ได้ถูกจัดเก็บในปกติ.dataหรือ.textอื่น ๆ เนื่องจากคำสั่ง
static inlineในคลาสหมายความว่ามันเป็นนิยามประเภทและไม่ประกาศ (อนุญาตให้สมาชิกแบบคงที่จะถูกกำหนดในชั้นเรียน) และทำให้มันอินไลน์; ตอนนี้มันจะทำงานเหมือนด้านบน
static inlineที่ขอบเขตไฟล์มีผลกับคอมไพเลอร์เท่านั้น มันหมายถึงคอมไพเลอร์: ปล่อยสัญลักษณ์สำหรับฟังก์ชั่น / ข้อมูลนี้ถ้ามันถูกใช้ในหน่วยการแปลและทำเช่นนั้นเป็นสัญลักษณ์แบบคงที่ปกติ สำหรับแอสเซมเบลอร์ตอนนี้ไม่มีความแตกต่างระหว่างstaticและstatic inline
extern inlineเป็นการประกาศที่หมายความว่าคุณต้องกำหนดสัญลักษณ์นี้ในหน่วยการแปลหรือโยนข้อผิดพลาดคอมไพเลอร์; ถ้ามันถูกกำหนดให้ถือว่ามันเป็นแบบปกติinlineและกับแอสเซมเบลอร์และตัวเชื่อมโยงจะไม่มีความแตกต่างระหว่างextern inlineและinlineดังนั้นนี่คือคอมไพเลอร์การ์ดเท่านั้น
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
inline int i[5]ทั้งหมดที่กล่าวมาไม่มีสายข้อผิดพลาดที่จะพังทลายลงมา เห็นได้ชัดว่าถ้าคุณทำextern inline int i[] = {5};แล้วexternจะถูกละเว้นเนื่องจากคำจำกัดความที่ชัดเจนผ่านการมอบหมาย
inlineบนเนมสเปซให้ดูสิ่งนี้และสิ่งนี้