2011-12-10 25 views
6

pg474, K.N.KingInline Định nghĩa

"The general rule in C99 is that if all top-level declarations of a function in a particular file include inline but not extern, then the definition of the function in that file is inline."

  • một là gì: "Tuyên bố cấp cao nhất của một hàm" ??

"If the function is used anywhere in the program (including the file that containts its inline declaration), then an external declaration of the function will need to be provided by some other file. When the function is called, the compiler may choose to perform an ordinary call (using the function's external definition) or perform inline expansion (using the function's inline definition). There's no way to tell which choice the compiler will make, so it's crucial that the two definitions be consistent."

  • Cậu ta đang nói gì đây ??

"Variables with static storage duration are a particular problem for inline functions with external linkage"

Nhưng tôi nghĩ bạn không thể gọi hàm có liên kết bên ngoài! Trình biên dịch sẽ cung cấp cho một lỗi:

pg 473

"so attempting to call average from another file will be considered an error"

"Consequently, C99 imposes the following restrictions on an inline function with external linkage (but not on one with internal linkage): The function may not define a modifiable static variable. The function may not contain references to variables with internal linkage."

Tại sao ?? Nếu hàm là nội tuyến và bên ngoài, thì ngay cả khi nó khai báo một số static int i; vì hàm không thể liên kết với bạn, bạn không thể gọi nó là nhưng sẽ không tạo biến tĩnh bên ngoài các hàm nội tuyến ngăn xếp - vì vậy bạn có thể liên kết với nó? Các chức năng nội tuyến có khung ngăn xếp không? Những gì đang xảy ra ở đây??

Trả lời

12

Tôi biết tôi đã viết rất nhiều, nhưng tôi đã cố gắng giải thích các khái niệm về lưu trữ và liên kết bên cạnh các giải thích của tôi về văn bản của bạn. Hi vọng điêu nay co ich!

"The general rule in C99 is that if all top-level declarations of a function in a particular file include inline but not extern, then the definition of the function in that file is inline."

What is a: "top-level declaration of a function"??

Các khai của một hàm được sử dụng ở dạng tương tự như tuyên bố của một biến. Đó là một câu lệnh đơn khai báo tên, kiểu trả về và các kiểu tham số của một hàm. Hàm Định nghĩa là mã thực của hàm.

khai Ví dụ:

int foo(int bar); 

định nghĩa Ví dụ:

int foo(int bar){ 
    return -bar; 
} 

Một top-level khai chức năng đơn giản là một lời tuyên bố đó là tại tập tin phạm vi (tức là, bên ngoài của bất kỳ khối). Đây thường là nơi tất cả các khai báo hàm là, mặc dù có thể khai báo và định nghĩa các hàm bên trong các hàm khác.

"If the function is used anywhere in the program (including the file that containts its inline declaration), then an external declaration of the function will need to be provided by some other file. When the function is called, the compiler may choose to perform an ordinary call (using the function's external definition) or perform inline expansion (using the function's inline definition). There's no way to tell which choice the compiler will make, so it's crucial that the two definitions be consistent."

Huh??? What is he saying here??

Trước hết, liên kết là gì? Liên kết của một biến hoặc hàm xác định cách trình biên dịch sẽ xử lý nhiều trường hợp của đối tượng đó. Các số nhận dạng không có liên kết luôn là 'cá nhân'. Đó là, nhiều khai báo của định danh trong chương trình luôn được coi là các thực thể riêng biệt/riêng biệt. Các tham số chức năng và biến cục bộ không có liên kết. Tất cả các tham chiếu đến số nhận dạng có liên kết ngoài bên ngoài đề cập đến cùng một thực thể. Đây là từ khóa C 'extern'. Theo mặc định, số nhận dạng toàn cầu có liên kết bên ngoài. Điều này có nghĩa là, ví dụ, nếu bạn có biến toàn cầu "int x;" trong hai tệp nguồn của chương trình, chúng sẽ được liên kết với nhau và được coi là cùng một biến.Liên kết bên trong có nghĩa là tất cả các khai báo của định danh trong một tệp nguồn tham chiếu đến một thực thể duy nhất, nhưng các khai báo của cùng một định danh trong các tệp nguồn khác tham chiếu đến các thực thể khác nhau. Đây là cách C làm cho mọi thứ "riêng tư" thành một tệp. Đây là từ khóa C 'tĩnh', trong phạm vi tệp.

Bây giờ, quay lại đoạn văn. Không thể xác định hàm nhiều hơn một lần. Vì vậy, các tệp nguồn muốn sử dụng các hàm từ các tệp nguồn khác cần phải bao gồm một khai báo bên ngoài (đó là thông tin cần thiết để thực hiện cuộc gọi hàm). Những gì đoạn này giải thích là về những gì sẽ xảy ra khi một tập tin có một khai báo bên ngoài với một hàm nội tuyến. Trình biên dịch phải chọn có nên tìm nạp định nghĩa nội tuyến hay không và chèn nó ở đâu mà hàm đang được gọi, hoặc nếu nó giữ lại liên kết bên ngoài, làm cho việc thực hiện chuyển sang văn bản mã như bình thường; và không có cách nào để dự đoán lựa chọn trình biên dịch sẽ thực hiện.

"Variables with static storage duration are a particular problem for inline functions with external linkage"

But i thought you couldn't call a function with external linkage! The compiler would give an error: pg 473 "so attempting to call average from another file will be considered an error"

Nếu bạn không thể gọi hàm được xác định trong tệp nguồn khác (tức là, hàm được liên kết bên ngoài), C sẽ là ngôn ngữ rất yếu và nhàm chán!

"Consequently, C99 imposes the following restrictions on an inline function with external linkage (but not on one with internal linkage): The function may not define a modifiable static variable. The function may not contain references to variables with internal linkage."

Why?? If a function is inline and extern, then even if it does declare a static int i; since the function can't be linked to you can't call it, but won't a static variable be created outside the inline functions stack-frame - so you should be able to link to it? Do inline functions have a stack frame? What's going on here??

Một lưu trữ tĩnh biến là một trong đó không phải là một phần của việc thực hiện ngăn xếp. Không gian của nó được cấp phát một lần, trước khi chương trình bắt đầu chạy, và tồn tại trong suốt quá trình thực thi. Họ giữ lại bất cứ giá trị ban đầu nào cho đến khi một giá trị khác được gán. Biến toàn cục (phạm vi tệp) được lưu trữ tĩnh theo mặc định. Điều này trái ngược với các biến số được lưu tự động, được cấp phát trên ngăn xếp ngay trước khi thực thi chương trình vào khối mà chúng được khai báo và các biến được loại bỏ khi thực thi rời khỏi khối đó. Các biến cục bộ (phạm vi khối) được mặc định tự động.

Quay lại câu hỏi: vấn đề với biến được lưu trữ tĩnh bên trong một hàm nội tuyến là gì? Một biến được lưu trữ tĩnh trong một hàm tồn tại dưới giả thiết rằng chỉ có một định nghĩa của hàm đó, và do đó chỉ có một định nghĩa của biến tĩnh đó. Nhưng nội tuyến, theo định nghĩa, là một sự lặp lại của định nghĩa hàm để bạn không cần phải nhảy xung quanh mã văn bản trong một cuộc gọi hàm. Nếu một biến tĩnh tồn tại trong hàm, thì bạn sẽ phải nhảy đến vị trí lưu trữ của nó, đánh bại mục đích của nội tuyến, đó là có một bản sao của tất cả mọi thứ "ngay tại đó". Giải pháp: yêu cầu biến không thể sửa đổi, để trình biên dịch có thể nội tuyến giá trị vĩnh viễn.

Trên câu hỏi cuối cùng của bạn: chức năng nội tuyến có khung ngăn xếp: đó là cùng một khung ngăn xếp của hàm gọi, vì văn bản mã của hàm nội tuyến đang được sao chép để tránh chi phí tiêu chuẩn của chức năng nhảy bên ngoài bình thường .