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
บนเนมสเปซให้ดูสิ่งนี้และสิ่งนี้