C ++ nội tuyến hoàn toàn khác với C nội tuyến .
#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;
}
inlinetự nó ảnh hưởng đến trình biên dịch, trình biên dịch và trình liên kết. Đó là một chỉ thị cho trình biên dịch nói rằng chỉ phát ra một biểu tượng cho chức năng / dữ liệu này nếu nó được sử dụng trong đơn vị dịch thuật và nếu nó giống như các phương thức lớp, hãy nói với trình biên dịch lưu trữ chúng trong phần .section .text.c::function(),"axG",@progbits,c::function(),comdathoặc .section .bss.i,"awG",@nobits,i,comdatcho dữ liệu.
Điều này sau đây .section name, "flags"MG, @type, entsize, GroupName[, linkage]. Ví dụ, tên phần là .text.c::function(). axGcó nghĩa là phần này có thể được phân bổ, thực thi và trong một nhóm, tức là tên nhóm sẽ được chỉ định (và không có cờ M nên sẽ không chỉ định kích thước); @progbitscó nghĩa là phần chứa dữ liệu và không trống; liên kết có nghĩa là trong tất cả các tệp đối tượng, tất cả các phần gặp phải với tên nhóm được gắn thẻ comdat này sẽ bị xóa khỏi tệp thực thi cuối cùng ngoại trừ 1, tức là trình biên dịch đảm bảo rằng chỉ có một định nghĩa trong đơn vị dịch thuật và sau đó báo cho trình biên dịch mã đặt nó trong nhóm riêng của nó trong tệp đối tượng (1 phần trong 1 nhóm) và sau đó trình liên kết sẽ đảm bảo rằng nếu bất kỳ tệp đối tượng nào có một nhóm có cùng tên, thì chỉ bao gồm một trong .exe cuối cùng. Sự khác biệt giữac::function()là tên nhóm và nhóm cócomdatinlinevà không sử dụng inlinehiện được hiển thị cho trình biên dịch chương trình và kết quả là trình liên kết, bởi vì nó không được lưu trữ trong thường xuyên .datahoặc.text vv do các lệnh của chúng.
static inlinetrong một lớp có nghĩa là nó là một định nghĩa kiểu và không khai báo (cho phép thành viên tĩnh được định nghĩa trong lớp) và làm cho nó thành dòng; bây giờ nó hành xử như trên.
static inlinetại phạm vi tập tin chỉ ảnh hưởng đến trình biên dịch. Nó có nghĩa là trình biên dịch: chỉ phát ra một biểu tượng cho chức năng / dữ liệu này nếu nó được sử dụng trong đơn vị dịch và làm như một biểu tượng tĩnh thông thường (lưu trữ in.text /.data mà không có lệnh .globl). Đối với trình biên dịch, bây giờ không có sự khác biệt giữa staticvàstatic inline
extern inlinelà một khai báo có nghĩa là bạn phải xác định ký hiệu này trong đơn vị dịch hoặc lỗi trình biên dịch; nếu nó được định nghĩa thì hãy coi nó như một trình biên dịch thông thường inlinevà trình biên dịch chương trình và trình liên kết sẽ không có sự khác biệt giữa extern inlinevà inlinevì vậy đây chỉ là một trình bảo vệ trình biên dịch.
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
Toàn bộ ở trên mà không có dòng lỗi sụp đổ đến inline int i[5]. Rõ ràng nếu bạn đã làm extern inline int i[] = {5};thìextern sẽ bị bỏ qua do định nghĩa rõ ràng thông qua chuyển nhượng.
inlinetrên một không gian tên, xem cái này và cái này