2010-01-10 7 views

Trả lời

14

Nó được gọi là "bao gồm bảo vệ". Mục đích là để ngăn chặn các tập tin từ phải được phân tích cú pháp nhiều lần nếu nó được bao gồm nhiều lần.

+0

Và để ngăn nhiều định nghĩa của cùng một lớp. – James

+1

Đã bao giờ có chỉ thị #import hay chỉ là trí tưởng tượng của tôi? –

+2

@Autopulated: Đó là những gì ông có nghĩa là bằng cách phân tích cú pháp nhiều lần. Có nhiều thứ hơn so với định nghĩa lại lớp để lo lắng; tất cả được đóng gói bằng "phân tích cú pháp nhiều". – GManNickG

3

Nó được gọi là bảo vệ bao gồm. Bạn có thể viết mà không có chúng cho đến khi bạn bắt đầu viết các chương trình lớn và tìm ra rằng bạn cần phải bao gồm cùng một tệp .h nhiều lần, trực tiếp hoặc gián tiếp, từ tệp .c. Sau đó, không bao gồm các bảo vệ, bạn sẽ nhận được nhiều lỗi định nghĩa, nhưng với chúng, nội dung tệp tiêu đề được phân tích cú pháp chỉ một lần và bỏ qua tất cả các lần tiếp theo, tránh những lỗi đó. Đó là một thực hành tốt để luôn luôn sử dụng chúng.

4

Nó ngăn chặn nhiều tạp trong một tệp. Có thể thực hiện tương tự bằng cách sử dụng

#pragma once 

Chỉ thị, nhưng những #ifndef là chuẩn do đó được mọi trình biên dịch hỗ trợ.

+3

#pragma một lần. Là một phần mở rộng trình biên dịch cụ thể. –

+0

... nhưng được hỗ trợ rộng rãi, công bằng –

-1

Nếu tệp tiêu đề chứa định nghĩa như

int i;
hơn, được bao gồm nhiều lần mà không có bảo vệ, sẽ tạo ra lỗi biên dịch.
ifndef kiểm tra rằng một số biến tiền xử lý không được xác định (và nó không phải là, lần đầu tiên), sau đó xác định nó một cách rõ ràng để tránh bị bắt lại. Trong MSVC bạn cũng có thể sử dụng
#pragma once
thay vì ifndef.

1

Nếu tôi hiểu chính xác, bạn muốn biết nếu không có bảo vệ bao gồm, có thể bao gồm tệp tiêu đề nhiều lần gây ra lỗi hoặc hành vi nguy hiểm. Đây là sau khi loại trừ nhiều định nghĩa, v.v.

Hãy tưởng tượng một lập trình viên độc hại có tệp tiêu đề không có bộ bảo vệ kèm theo. Tệp tiêu đề của anh ấy xác định một macro, SZ, là kích thước mà bạn sử dụng cho các mảng được phân bổ tĩnh của mình. Các lập trình viên có thể viết tập tin tiêu đề của mình như thế này:

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

Bây giờ, nếu bạn bao gồm các tập tin tiêu đề một lần, bạn sẽ có được SZ bằng 1024. Nếu bạn bao gồm nó hai lần, SZ trở thành 128. Tất nhiên, hầu hết các gian thực các lập trình viên thế giới không độc hại, và không ai thực sự viết mã như trên.

Lưu ý rằng các tiêu chuẩn C cho phép assert.h#include d nhiều hơn một lần với hành vi khác nhau tùy thuộc vào việc NDEBUG được xác định tại thời điểm bao gồm của assert.h. Vì vậy, assert.h không thể bao gồm bảo vệ. Đó là một tính năng, không phải là một lỗi, mặc dù.