2012-06-26 48 views
13

Tôi có một vĩ mô mà đi số dòng và tên tập tin vào một trình xử lý lỗi:Hành vi của __LINE__ trong các chức năng inline

#define SYSTEM_FAILURE (error_code, comment) \ 
    System_Failure((error_code), (comment), __LINE__, __FILE__); 

như thế nào __LINE__ sẽ được giải quyết khi sử dụng bên trong một chức năng inlined?

file.h: 
inline int divide(int x, int y) 
{ 
    if (y == 0) 
    { 
     SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error"); 
    } 
    return x/y; 
} 

__LINE__ sẽ chứa số dòng trong tập tin tiêu đề, hoặc số dòng của tập tin nguồn nơi hàm inline được gọi là (giả biên dịch nào một "dán" trong mã nguồn)?

+2

Không thể dùng thử vì hành vi có thể khác nhau trên trình biên dịch và có thể không phải là trạng thái chuẩn. –

+2

Downvoters: Tại sao downvote? Câu hỏi đặt ra là sử dụng các hàm C, inline và macro trong một hệ thống nhúng. –

+1

@Thomas, kiểm tra điều này trên trình biên dịch của riêng bạn và bao gồm các kết quả trong câu hỏi của bạn (do đó làm cho nó giống như 'tiền xử lý của tôi thực hiện điều này, nó là tiêu chuẩn?') Sẽ có (và vẫn có thể) nhiều hơn các downvotes. –

Trả lời

20

Trong C và C++, macro không (đối với hầu hết các phần) được đánh giá với bất kỳ kiến ​​thức nào về mã thực tế và được xử lý trước mã (do đó tên "tiền xử lý"). Do đó, __FILE__ sẽ đánh giá thành "tệp.h" và __LINE__ sẽ đánh giá số dòng tương ứng với dòng trên đó SYSTEM_FAILURE xuất hiện trong tệp.h.

7

Vì macro được thay thế bằng định nghĩa của chúng trước khi biên dịch, __LINE__ sẽ chứa dòng thực của tệp mà bạn đã sử dụng macro. Nội tuyến sẽ không ảnh hưởng đến hành vi này chút nào.

3

__LINE__ sẽ là dòng của tệp tiêu đề vì trình xử lý trước sẽ đánh giá nó trước khi trình biên dịch sẽ nhìn thấy nó.

Các vấn đề liên quan