2009-04-10 32 views
42

Tôi có một số mã C++. Trong mã có nhiều lớp được định nghĩa, các hàm thành viên, các hàm tạo, các trình phá hủy cho các lớp đó, một vài lớp mẫu và rất nhiều công cụ C++. Bây giờ tôi cần phải chuyển đổi mã nguồn thành mã C đơn giản.Cách chuyển Mã C++ thành C

tôi đều có câu hỏi sau:

  1. Có bất kỳ công cụ để chuyển đổi mã C++ và tiêu đề file mã C?

  2. Tôi có phải làm tổng viết lại của mã (Tôi sẽ phải loại bỏ các nhà thầu, hủy và di chuyển mã đó vào một số init(), deinit() chức năng; lớp học thay đổi cấu trúc, làm cho chức năng thành viên hiện có như con trỏ hàm trong những các cấu trúc mới được định nghĩa và sau đó gọi các hàm đó bằng cách sử dụng các con trỏ hàm vv ..)?

  3. Nếu tôi phải chuyển đổi nó theo cách thủ công, tôi nên chú ý đến cấu trúc/ngữ nghĩa dữ liệu mã C++ cụ thể nào khi thực hiện chuyển đổi từ C++ sang C?

Trả lời

29

Có một công cụ như vậy, trình biên dịch C++ của Comeau. . Nó sẽ tạo ra mã C mà bạn không thể tự bảo trì, nhưng đó không phải là vấn đề. Bạn sẽ duy trì mã C++ và chỉ chuyển đổi sang C khi đang di chuyển.

+0

@MSalters: Cảm ơn con trỏ về trình biên dịch Comeaus. Nhưng thật đáng buồn là nó không phục vụ cho mục đích của tôi, vì không thể có được mã định dạng trung gian trình biên dịch comeaus, và thậm chí nếu chúng ta thu được bằng cách nào đó nó không thể biên dịch được bằng các trình biên dịch ANSI-C bình thường. – goldenmean

+2

Nếu mã của bạn không sử dụng ngoại lệ và các mẫu, bạn có thể có cơ hội nhận một bản sao cũ của cfront để hoạt động trên mã của bạn. Nhưng như MSalters cho biết nó sẽ xấu xí :-) – lothar

+0

nó cũng sẽ phải sử dụng không có chức năng thư viện chuẩn –

6

Trong khi bạn có thể thực hiện OO bằng C (ví dụ: bằng cách thêm tham số đầu tiên vào phương pháp, và xử lý thủ công một thứ gì đó như vtables cho đa hình), điều này không bao giờ thỏa đáng như thiết kế và trông xấu xí (thậm chí với một số tiền tố) bộ xử lý hack).

Tôi khuyên bạn ít nhất nên xem xét thiết kế lại để so sánh cách điều này sẽ hoạt động.

Nói chung rất nhiều phụ thuộc vào câu trả lời cho câu hỏi chính: nếu bạn có mã C++ đang hoạt động, tại sao bạn lại muốn C?

+5

Lý do của tác giả rõ ràng là về mặt tình hình cụ thể, nhưng lý do vẫn tồn tại. Đôi khi trình biên dịch C++ không tồn tại trên một nền tảng cụ thể hoặc chỉ có thể không có sẵn vì một lý do nào đó. Nó cũng phục vụ như một công cụ học tập rất tuyệt vời. – TechZilla

17

http://llvm.org/docs/FAQ.html#translatecxx

PS: tôi chưa từng sử dụng. Cho tôi biết nếu nó hoạt động.

+0

@ plan9assembler: Cảm ơn con trỏ. Tôi sẽ kiểm tra nó và cho bạn biết. – goldenmean

+1

Tôi đã cố chuyển đổi hello_world.cpp thành tệp C bằng cách sử dụng LLVM. Mã C kết quả là xấu xí như mã máy. Các bộ tiền xử lý bao gồm tất cả đều biến mất. – MikimotoH

+1

@MikimotoH, có vẻ như vậy bởi vì nó không phải là cú pháp để dịch cú pháp nguồn. Nó thực sự là một trình biên dịch có thể xuất ra c, có nghĩa là bạn vẫn còn phụ thuộc vào bất kỳ thư viện C++ được liên kết nào. Nó thực sự tốt nhất được sử dụng để gỡ lỗi hoặc xem tài liệu. BTW: xấu xí nó có thể được, nhưng tôi tin rằng nó tốt hơn so với mã máy và bạn ít nhất có thể học hỏi từ nó. Bạn có thể học tốt hơn từ clang C++ đến c, hơn bất kỳ sự tháo gỡ nào. – TechZilla

5

Có thể tốt ol 'cfront sẽ làm gì?

+3

Theo tôi biết, cfront đã không được duy trì trong một thời gian dài và không có khả năng xử lý mã C++ hiện đại. –

4

Trình biên dịch bao gồm hai khối chính: 'giao diện người dùng' và 'kết thúc'. Phần đầu của trình biên dịch phân tích mã nguồn và xây dựng một số dạng 'đại diện trung gian' của mã nguồn được cho là dễ dàng hơn để phân tích bằng thuật toán máy hơn là mã nguồn (tức là trong khi mã nguồn ví dụ: C++ được thiết kế để giúp lập trình viên con người viết mã, biểu mẫu trung gian được thiết kế để giúp đơn giản hóa thuật toán phân tích biểu mẫu trung gian cho biết dễ dàng hơn). Phần cuối của trình biên dịch có dạng trung gian và sau đó chuyển đổi nó thành 'ngôn ngữ đích'.

Bây giờ, ngôn ngữ đích cho trình biên dịch sử dụng chung là ngôn ngữ lắp ráp cho các bộ vi xử lý khác nhau, nhưng không có gì để ngăn cản trình biên dịch kết thúc để tạo mã bằng một ngôn ngữ khác, miễn là ngôn ngữ đích được cho là (ít nhất) linh hoạt như một bộ tổng hợp CPU chung. Bây giờ, như bạn có thể tưởng tượng, C chắc chắn là linh hoạt như một bộ xử lý của CPU, như vậy mà một trình biên dịch C + + C thực sự không có vấn đề gì để thực hiện từ một pov kỹ thuật.

Vì vậy, bạn có: C++ --- Frontend ---> someIntermediaryForm --- backend ---> C

Bạn có thể muốn kiểm tra những kẻ ra: http://www.edg.com/index.php?location=c_frontend (liên kết ở trên chỉ là thông tin cho những gì thể được thực hiện, họ cấp phép trước của họ kết thúc cho hàng chục ngàn đô la)

PS theo như tôi biết, không có một C như ++ để biên dịch C bởi GNU, và điều này hoàn toàn đánh bại tôi (nếu Tôi đúng về điều này). Bởi vì ngôn ngữ C là khá nhỏ và cơ chế nội bộ khá thô sơ, trình biên dịch C đòi hỏi một công việc giống như một năm (tôi có thể nói với bạn điều này vì tôi đã viết một trình biên dịch như vậy từ nhiều năm trước, và nó tạo ra một [ mã trung gian máy ảo) và có thể có trình biên dịch C++ được cập nhật, duy trì trong khi chỉ phải viết trình biên dịch C một lần ... Điện thoại

+0

ngôn ngữ đích cho các trình biên dịch sử dụng chung là các ngôn ngữ lắp ráp (hoặc mã máy ??) cho các bộ xử lý khác nhau – qPCR4vir

2

Đây là thông tin cũ chỉ nhưng rõ ràng là C++ Faq có một số section về điều này. Điều này rõ ràng sẽ được cập nhật nếu tác giả được liên lạc để điều này có thể sẽ được cập nhật thêm về lâu dài.

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