2013-07-19 22 views
6

#pragma once không phải là tiêu chuẩn, nhưng được hỗ trợ bởi trình biên dịch như gcc và VC++. Nó giúp tránh các nhân viên bảo vệ.#pragma có từng thêm nhân viên bảo vệ không?

Nhưng, trong nội bộ, trình biên dịch có thêm trình bảo vệ bao gồm cho #pragma một lần không? Nếu không, trình biên dịch đảm bảo rằng tiêu đề như vậy chỉ được bao gồm một lần như thế nào?

+0

Tôi tưởng tượng trình biên dịch đơn giản theo dõi các tệp tiêu đề nào đã được bao gồm và ở đâu. –

+0

Có lẽ một cái gì đó tương tự như phát hiện một chu kỳ trong một đồ thị hướng –

+0

@OliCharlesworth Khả năng không thể tránh được, nhưng trong dự án lớn, có thể không có hàng ngàn tập tin tiêu đề? Vì vậy, nó sẽ là cách hiệu quả? –

Trả lời

10

Tôi chắc chắn nó hoạt động giống như include_once trong PHP - có một bảng "tệp đã được đưa vào". Trình biên dịch, trong trường hợp này, tìm trong danh sách cho tệp mà nó sắp đưa vào và nếu một tệp đã được đưa vào, không bao gồm nó nữa. Nếu trình biên dịch, trong khi xử lý tệp, hãy xem #pragma once, sau đó thêm tệp này vào "tệp đã được bao gồm".

Vì vậy, nó không giống như bảo vệ bao gồm trên một mức độ chi tiết, nhưng nó có tác dụng tương tự như bảo vệ bao gồm. Nó cũng làm cho mã ít di động hơn, vì có rất nhiều trình biên dịch không hỗ trợ điều này.

+3

Trên thực tế tất cả các trình biên dịch chính hỗ trợ nó ngày nay. –

+2

"tất cả chính" có thể không bao gồm hầu hết các thị trường nhúng ... Và nếu tôi có thể được chỉ ra rằng "điều này sẽ không hoạt động nếu mã được biên dịch trong một trình biên dịch nhúng", tôi chắc chắn tôi sẽ sử dụng nó trở lại những người khác khi đối số của họ thất bại vào thời điểm đó ...;) –

+1

Tôi thích viết các ứng dụng cho nhiều giải pháp nhúng bằng cách sử dụng '#pragma once' trong GCC kể từ 4.4.0. Thật thú vị khi lập luận dựa trên giả định rằng một người nào đó chưa bao giờ nghe nói hoặc nhìn thấy một môi trường phát triển nhúng, nhưng trước tiên hãy thận trọng để kiểm tra sự thật. ;) –

0

Không, trình biên dịch sẽ không thêm bộ bảo vệ, nhưng điều đó không quan trọng vì nó sẽ không bao gồm cùng một tệp nữa, vì vậy sẽ không bao giờ có thay đổi để đánh giá những người bảo vệ đó ngay từ đầu.

+0

Đó là câu hỏi của tôi thực sự, làm thế nào nó biết không bao gồm cùng một tập tin. –

+1

@ppk: Nó có thể theo dõi tên tập tin đã được '# include'd sử dụng bộ nhớ máy tính. Đây không phải là câu hỏi. Làm thế nào để bạn biết không đăng cùng một câu hỏi trên SO hai lần? –

+2

Một ngoại lệ đáng chú ý: Nếu cùng một tệp là '# include'd thông qua hai tên tệp khác nhau (ví dụ: liên kết tượng trưng hoặc liên kết cứng trên hệ thống * nix), thì' #pragma once' sẽ không bảo vệ được, vì nó là dựa trên tên tệp. Mặc dù các bảo vệ '#ifndef/# define' điển hình sẽ vẫn hoạt động. – abelenky

-2

Khi thêm "#pragma once" vào tệp "file.h", trình biên dịch giúp chúng tôi đảm bảo "tệp.h" sẽ chỉ được mở noce.

Nhưng nếu tôi có một bản sao của "file.h" có tên "file_copy.h", nếu nó được bao gồm, nó sẽ được mở.

+1

Đó là _what_ nó, không _how_. –

+0

Vâng, xin lỗi về điều đó. –

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