2011-08-11 74 views
8

Tôi đang nghiên cứu một đoạn mã từ thư viện GSL và bối rối bởi một vài dòng ở đầu tệp tiêu đề. Tôi hiểu những gì #undef, #ifdef và vv làm nhưng những gì tôi không hiểu là tại sao họ về cơ bản đã đặt lại định nghĩa của _BEGIN_DECLS và sau đó tiếp tục và xác định lại nó? Về mặt kỹ thuật, không nên có bất kỳ định nghĩa nào trước đó, đúng không? Ý tôi là, những thứ đó là tĩnh và không thể thay đổi. Dù sao, đây là đoạn trích từ các mã:Sử dụng #undef trong C++

#undef __BEGIN_DECLS 
    #undef __END_DECLS 
    #ifdef __cplusplus 
    # define __BEGIN_DECLS extern "C" { 
    # define __END_DECLS } 
    #else 
    # define __BEGIN_DECLS /* empty */ 
    # define __END_DECLS /* empty */ 
    #endif 
+6

Tại sao bạn nên downvote? Có vẻ như một câu hỏi hợp lý với tôi. –

Trả lời

10

Bạn không được phép #define một macro đã được xác định trừ trường hợp danh sách tham số và danh sách thay thế giống hệt nhau.

Nếu trước đó __BEGIN_DECLS đã được xác định để thay thế bằng một thứ khác không phải là extern "C" {, thì #define __BEGIN_DECLS extern "C" { sẽ không hợp lệ và chương trình sẽ bị hỏng.

Về mặt kỹ thuật, không nên có bất kỳ định nghĩa nào trước đó, đúng không?

Có thể có, chắc chắn.

+0

Cảm ơn James, có ý nghĩa. Tôi không nghĩ ra các định nghĩa có thể có khác của _BEGIN_DECLS cho các mục đích khác. – GKED

+0

Đặc biệt vì các số nhận dạng có dấu gạch dưới kép được dành riêng cho việc triển khai. –

2

Không thực sự. Nếu một thư viện khác mà bạn đang gọi sử dụng cùng một tên, điều đó sẽ được xác định.

Vì vậy, vì bạn không thể xác định nó trên định nghĩa khác, trước tiên bạn gọi #undef và sau đó #define.

Đôi khi việc sử dụng #ifdef hoặc #ifndef là thích hợp.