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;
}
inline
tự 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(),comdat
hoặc .section .bss.i,"awG",@nobits,i,comdat
cho 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()
. axG
có 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); @progbits
có 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ócomdat
inline
và không sử dụng inline
hiệ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 .data
hoặc.text
vv do các lệnh của chúng.
static inline
trong 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 inline
tạ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 static
vàstatic inline
extern inline
là 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 inline
và 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 inline
và inline
vì 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.
inline
trên một không gian tên, xem cái này và cái này