2015-04-17 13 views
6

Tôi đang cố gắng tìm tất cả các địa điểm nơi #include được đặt bên trong externC khối. Có thể kiểm tra điều này bằng cách sử dụng bộ tiền xử lý không? Tôi muốn thêm một cái gì đó như thế này vào các tệp tiêu đề của tôi:Cách phát hiện ra rằng "C" bên ngoài có hiệu lực

#ifdef EXTERN_C_IS_IN_EFFECT 
#error File included from extern "C" block! 
#endif 

Tôi cũng đang tìm cách khác để không biên soạn trong trường hợp này, ví dụ: sử dụng một số thuộc tính đặc biệt. Tôi đang sử dụng gcc 4.4.7.

tôi định nghĩa sau vĩ mô và sau đó sử dụng nó trong tất cả các tiêu đề mà cần bảo vệ chống lại đưa vào externC khối:

#define ASSERT_NO_EXTERN_C void assert_no_extern_c(int); void assert_no_extern_c(double); 
+7

'extern' không được bộ tiền xử lý nhận thấy. –

+1

Nếu bạn cần điều này để tìm tất cả các tệp mà bạn có khóa "C" bên ngoài, bạn có thể thực hiện dự án mã của mình với tất cả các tệp để tìm kiếm IDE yêu thích của bạn và thực hiện "Tìm kiếm trong toàn bộ Dự án/Giải pháp/..." – Incubbus

+0

@ πάνταῥεῖ Hm. '#define extern static'? –

Trả lời

11

Có thể bạn có thể xác định 2 nguyên mẫu chức năng có cùng tên và các thông số khác nhau. Bạn sẽ nhận được cảnh báo trong trường hợp khối "C" bên ngoài. Và nó được cho phép trong C++.

+0

Cảm ơn! Điều này làm việc cho tôi: void assert_no_extern_c (int); void assert_no_extern_c (double); –

6

Đó là không thể vì tiền xử lý chạy trước bất kỳ phân tích cú pháp được thực hiện; có nghĩa là, bộ tiền xử lý thậm chí không biết extern "C" là gì và hành động của nó không thể phụ thuộc vào sự hiện diện của một chỉ thị như vậy. Tuy nhiên, các thông số liên kết làm tổ, do đó, thay vì đảm bảo rằng includer không chỉ định extern "C", bạn có thể đặt tiêu đề của mình trong thông số extern "C++" để đảm bảo rằng nó sử dụng liên kết C++.

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