2010-05-15 42 views
10

Tôi gặp sự cố khi viết mã C++ sử dụng tệp tiêu đề được thiết kế cho tệp C. Đặc biệt, các tập tin tiêu đề sử dụng một tên biến được gọi là lớp:Sử dụng lớp từ khóa làm tên biến trong C++

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs); 

này hoạt động trong C như lớp không được thực hiện như là một từ khóa, nhưng trong C++, lớp. Vì vậy, có anyway tôi có thể #include tập tin tiêu đề này vào một tập tin c + +, hoặc tôi ra khỏi may mắn?

Cảm ơn bạn.

+0

Nếu mã đó không được chuẩn bị để được phân tích cú pháp bằng trình biên dịch C++, hãy chuẩn bị để có thêm rắc rối. Ví dụ, nếu đây là một C lib bạn muốn liên kết, tất cả các khai báo phải được bọc trong 'extern" C "' để trình liên kết biết rằng nó cần tìm kiếm các biểu tượng không bị xáo trộn. – sbi

+0

Trình biên dịch vẫn ném vừa vặn khi tôi chỉ quấn #include trong "C" bên ngoài. Tôi có nên bao gồm lừa của aaa bên trong của bạn? –

+0

Tôi vừa nhận ra đây là một tiêu đề Python. Tôi không có ý tưởng mà bạn đang sử dụng tiêu đề và những gì nó được sử dụng cho, nhưng bạn có biết http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

Trả lời

9

thử một cái gì đó như thế này:

#define class class_variable 
// if class is only used in declarations, you can also do 
// #define class 
#include "c.h" 
#undef class 

nó có thể gây ra vấn đề, nhưng có lẽ giá trị một shot

thay thế (sử dụng Makefile):

python_.hpp: /usr/include/python.h 
    perl -pe 's/\Wclass\W//g' $< > [email protected] 
... 

#include "python_.hpp" 
+0

Nó hoạt động ... mặc dù tôi chưa liên kết với các thư viện, cảm ơn bạn. –

+0

@Leif chúc may mắn.Cũng có thể muốn kiểm tra thủ công tệp đã xử lý trước để đảm bảo không có bất kỳ tác dụng phụ không mong muốn nào được giới thiệu – Anycorn

+1

Nếu bạn sử dụng bất kỳ tiêu đề thư viện chuẩn nào, hãy xác định macro bằng từ khóa vì tên của nó không được phép (cf. http: // stackoverflow .com/questions/2726204/c-preprocessor-xác định-ing-a-từ khóa-là-nó-tiêu chuẩn-conforming). C là một chút khoan dung hơn C++ trong lĩnh vực này. –

3

Bạn luôn có thể sử dụng #ifdef __cplusplus để tạo ra một bản tuyên bố cụ thể đối với C++ trong đó tiêu đề

+0

Vì đây là một phần của kho lưu trữ mã lớn hơn, có lẽ tôi không nên mucking về chính tệp tiêu đề. –

3

Bạn sẽ cần phải sửa đổi các tiêu đề để thay thế 'đẳng cấp' với cái gì khác để biên dịch nó như C++.

1

Như một vấn đề thực tế, bạn' lại may mắn. "class" là một từ dành riêng dành riêng, bạn không thể sử dụng nó làm định danh biến.

Tôi cho rằng bạn có thể làm thủ thuật tiền xử lý, như

#define class othername 

Nhưng thực sự đó là ngớ ngẩn, quá, bởi vì nó sẽ làm cho mã của bạn khó hiểu và ngăn bạn sử dụng các lớp học thực sự.

Chỉ cần cắn viên đạn và đổi tên thông số 'theclass' hoặc thứ gì đó.

7

Nếu đây chỉ là tuyên bố, thì tên biến không quan trọng chút nào. Bạn hoàn toàn có thể xóa chúng hoặc thay đổi chúng theo cách bạn muốn. Điều này là do việc kê khai chỉ xác định tên và loại của các chức năng, đó là:

int BPY_class_validate(const char *, PyObject *, PyObject *, 
         BPY_class_attr_check*, PyObject **); 

Nhưng nếu bạn muốn tên (được mô tả nhiều hơn một chút), bạn chỉ có thể ném một dấu gạch dưới ở phần cuối của những gì bạn có:

int BPY_class_validate(const char *class_type, PyObject *class_, 
         PyObject *base_class, BPY_class_attr_check* class_attrs, 
         PyObject **py_class_attrs); 

Điều này sẽ không vi phạm bất kỳ mã nào khác.

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