2012-05-28 43 views
5

Tất cả các tập tin tiêu đề của tôi sử dụng bao gồm bảo vệ cũng như pragma một lần:"#pragma once" có khả năng gây ra lỗi không?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Tôi hiểu rằng pragma một lần không phải là tiêu chuẩn và có thể không phải trình biên dịch trên cùng, nhưng có bất kỳ cơ hội nó sẽ gây ra và lỗi? Sẽ tốt hơn nếu bằng cách nào đó kiểm tra xem nó có sẵn đầu tiên không?

#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE 
    #pragma once 
#endif 

#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Tôi muốn cung cấp pragma một lần như một tùy chọn để có thể tăng tốc biên soạn và tránh tên va chạm, trong khi vẫn cung cấp khả năng tương thích giữa các trình biên dịch.

+0

Tôi không thực sự biết C/C++, nhưng [bài viết MSDN này] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx) dường như gợi ý rằng những người không được công nhận bị bỏ qua. – Ryan

+0

có thể trùng lặp của [Is #pragma khi bảo vệ an toàn bao gồm?] (Http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

Xem thêm [Tại sao không C/C++ ´s #pragma sau khi đạt tiêu chuẩn ISO?] (Http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

Trả lời

9

Nếu #pragma once không được hỗ trợ nó sẽ chỉ đơn giản là bỏ qua [Ref # 1] và tiêu đề lính gác sẽ phục vụ quý khách với mục đích, vì vậy không có gì sai trong việc sử dụng cả hai, bạn không thực sự cần bất kỳ kiểm tra cho sự ủng hộ của #pragma once.

Vì vậy, cách lý tưởng là sử dụng cả hai #pragma once và bao gồm các nhân viên bảo vệ và bạn có mã di động cũng có thể tận dụng lợi thế của trình biên dịch tối ưu hóa #pragma once có thể hỗ trợ.


[Ref # 1]
Chuẩn C++ 03: 16,6 pragma chỉ

Một chỉ thị tiền xử lý của mẫu

# pragma pp-tokensopt new-line

gây ra triển khai thực hiện theo cách thức được triển khai. Bất kỳ pragma nào không được công nhận bởi việc triển khai sẽ bị bỏ qua.

5

Tiêu chuẩn cho biết "Bất kỳ bản pragma nào không được nhận dạng bởi việc triển khai sẽ bị bỏ qua.", Vì vậy bạn có thể sử dụng tốt, ngay cả khi trình biên dịch không biết #pragma một lần.

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