Trong C, không phải là lỗi khi truyền con trỏ đến và đi từ void *
.Relax void * casting in C++
Một trở ngại lớn trong việc chuyển sang C++ là cần phải đưa con trỏ khi trở về từ các hàm xử lý các con trỏ chung như malloc
và các hàm được khai báo trong mã của riêng tôi chẳng hạn như void *block_get(Blkno const blkno);
.
Mã của tôi tuy nhiên được dự định sẽ được biên soạn bằng C và trình biên dịch C++ thành công. Nếu tôi cung cấp rõ ràng phôi ở khắp mọi nơi vì lợi ích của C + +, họ phải là C-phong cách phôi và tôi có thể được che lỗi do đúc non-pointer loại đến và từ các loại con trỏ từ cả hai ngôn ngữ.
lỗi tài liệu tham khảo của tôi là như sau:
struct Cpfs *cpfs = calloc(1, sizeof(*cpfs));
mà trong MSVC sản xuất:
Lỗi C2440 2 lỗi: 'khởi': không thể chuyển đổi từ 'void *' thành 'Cpfs *' e: \ src \ cpfs \ cpfs.c 179
Rõ ràng tôi không thể sử dụng new
hoặc static_cast
mà tôi tự nhiên muốn sử dụng nếu tôi đã không còn sử dụng C. Cách tốt nhất để cung cấp sự an toàn tối đa kiểu xung quanh void *
cho mỗi ngôn ngữ với độ dài tối thiểu là gì?
Tại sao bạn cần chuyển sang tập hợp con C và C++ chung? Như bạn đã phát hiện ra nó hạn chế nghiêm trọng những gì C (cách khác những gì C + +) bạn có thể sử dụng. Hầu như tất cả các môi trường có sẵn C++ cũng có sẵn C và cũng cho phép bạn liên kết các tệp đối tượng C++ và C với nhau. Tôi không thể nhìn thấy những gì bạn nhận được bằng cách chuyển đến tập con chung. –
Đối với * loại an toàn trong C * (mà là một chút khó khăn), thực hiện một chức năng cho mỗi cấu trúc mà công việc là phân bổ và trả về một con trỏ đến một cấu trúc mới. Tương tự như vậy, hãy tạo một hàm để giải phóng cấu trúc. – rwong
Tôi muốn biết lý do để cố viết một chương trình biên dịch cho hai ngôn ngữ khác nhau. Đó thường là một cái gì đó còn lại cho câu đố. – GManNickG