2012-09-22 25 views
13

Possible Duplicate:
How to check (via the preprocessor) if a C source file is being compiled as C++ codeLàm cách nào để viết tệp tiêu đề C có thể được sử dụng trong các chương trình C++?

Tôi đang cố gắng tìm macro chuẩn sẽ kiểm tra xem tệp tiêu đề có đang được biên dịch dưới dạng C hay C++ hay không. Mục đích của điều này là tiêu đề có thể được bao gồm bởi mã C hoặc C++, và phải hoạt động hơi khác nhau tùy theo đó. Cụ thể là:

Trong C, tôi cần điều này là các mã:

extern size_t insert (const char*); 

Trong C++, tôi cần điều này là các mã:

extern "C" size_t insert (const char*); 

Thêm vào đó, là có một cách để tránh đặt # ifdef xung quanh mọi tuyên bố trong tiêu đề?

+1

Tôi có thể bị thiên vị, nhưng tôi cho rằng câu hỏi này bổ sung phải làm với extern. Vì trước đây tôi chưa biết về cú pháp "extern {...}", câu trả lời đã chọn của tôi hữu ích hơn nhiều so với cú pháp được đưa ra trong bản sao được đề xuất của bạn. Tôi sẽ chỉnh sửa câu hỏi để hiển thị sự khác biệt này. – Collin

+0

Tôi đã để lại x-ref cho câu hỏi này trên bản sao được đề xuất. Bạn có thể cải thiện sự khác biệt giữa hai bằng cách sửa đổi tiêu đề như 'Làm thế nào để có điều kiện xác định 'extern" C "' hoặc chỉ 'extern' tự động phát hiện trình biên dịch C hoặc C++?" Hoặc một cái gì đó dọc theo những dòng chung. –

+0

@JonathanLeffler Tôi đã chỉnh sửa tiêu đề để phản ánh những gì (tôi nghĩ) thực sự được hỏi, như minh họa bằng ví dụ trong văn bản. ... tìm kiếm điều này đã làm, tuy nhiên, tiết lộ một tiêu đề trùng lặp: http://stackoverflow.com/ câu hỏi/8742534/bao gồm-c-header-in-c-file ... nhưng không trùng lặp nội dung. –

Trả lời

27

Việc đặt các tệp tiêu đề C như sau để bình thường có thể được sử dụng trong các chương trình C++. Kiểm tra tập tin tiêu đề hệ thống của bạn như stdio.h và có thể bạn sẽ thấy điều này:

#ifdef __cplusplus 
extern "C" { 
#endif 

... 

#ifdef __cplusplus 
} 
#endif 
15

Câu trả lời là sử dụng macro __cplusplus. Trong trường hợp này, cách tiếp cận đơn giản nhất là:

extern 
#ifdef __cplusplus 
"C" 
#endif 
size_t insert (const char*); 

Macro này là một phần của tiêu chuẩn C++.

+4

Và nếu bạn muốn làm điều này cho nhiều hàm, chỉ tiêu là '#ifdef __cplusplus extern" C "{# endif' ...' #ifdef __cplusplus} # endif'. – chris

+4

Khả năng khác: '#ifdef __cplusplus' ...' #define EXTERN extern "C" '...' # else' ... '#define EXTERN extern' ...' # endif' (ở đâu ...biểu thị một dòng mới) –

+0

g ++ không thích #define extern extern "C" nó Rượu vang vậy: lỗi: dự kiến ​​không đủ tiêu chuẩn-id trước khi chuỗi liên tục – user1656671

7

Bạn có thể tìm thấy nó hợp lý để xác định ba macro để giúp với điều này:

#ifdef __cplusplus 
#define EXTERN_C_BEGIN extern "C" { 
#define EXTERN_C_END } 
#define EXTERN_C  extern "C" 
#else 
#define EXTERN_C_BEGIN /* Nothing */ 
#define EXTERN_C_END /* Nothing */ 
#define EXTERN_C  extern /* Or Nothing */ 
#endif /* __cplusplus */ 

Đây sẽ là hữu ích nhất trong tiêu đề chuẩn được bao gồm trong hầu hết các địa điểm trong dự án của bạn. Đối với một chức năng duy nhất, bạn có thể viết:

EXTERN_C size_t insert(const char *name); 

cho một nhóm các chức năng, bạn có thể viết:

EXTERN_C_BEGIN 

size_t other_insert(const char *name); 
size_t other_delete(const char *name); 
size_t other_update(const char *old_name, const char *new_name); 

EXTERN_C_END 

Nó được phép để bao gồm extern ở phía trước của các chức năng riêng biệt bên trong EXTERN_C_BEGIN để EXTERN_C_END khối.

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