@@ -837,6 +837,51 @@ $(H2 $(LNAME2 wrapping, Wrapping C Code))
837
837
$(P Then, `import file_ic;` instead of `import file;`, and use `S_t` when $(CCODE struct S) is desired.)
838
838
839
839
840
+ $(H2 $(LNAME2 ctod, Converting C Code to D Code))
841
+
842
+ $(P Sometimes its desirable to go further than importing C code, to actually do a C source to
843
+ D source conversion. Reasons include:)
844
+
845
+ $(UL
846
+ $(LI Migrating a C project to a D project.)
847
+ $(LI Equivalent D code can compile much faster, due to not needing a preprocessor, etc.)
848
+ $(LI Tweaking the D code to add attributes for memory safety, purity, etc.)
849
+ $(LI Eliminating the need for C-isms in the D part of the project.)
850
+ )
851
+
852
+ $(P This can be done with the D compiler by using the $(TT -Hf) switch:)
853
+
854
+ $(CONSOLE
855
+ dmd -c mycode.c -Hf=mycode.di
856
+ )
857
+
858
+ $(P which will convert the C source code in $(TT mycode.c) to D source code in $(TT mycode.di).
859
+ If the $(TT -inline) switch is also used, it will emit the C function bodies as well, instead
860
+ of just the function prototypes.)
861
+
862
+ $(H3 Impedance Mismatch)
863
+
864
+ $(P A precise mapping of C semantics, with all its oddities, to D source code is not
865
+ always practical. ImportC uses C semantics in its semantic analysis to get much closer
866
+ to exact C semantics than is expressible in D source code. Hence, the translation to
867
+ D source code will be less than perfect. For example:)
868
+
869
+ $(CCODE
870
+ int S;
871
+ struct S { int a, b; };
872
+ int foo(struct S s)
873
+ {
874
+ return S + s.a;
875
+ }
876
+ )
877
+
878
+ $(P will work fine in ImportC, because the `int S` and the `struct S` are in different
879
+ symbol tables. But in the generated D code, both symbols would be in the same symbol table, and will collide.
880
+ Such D source code translated from C will need to be adjusted by the user.)
881
+
882
+ $(P Nevertheless, reports from the field are that this conversion capability is a huge
883
+ timesaver for users who need to deal with existing C code.)
884
+
840
885
$(H2 $(LNAME2 warnings, Warnings))
841
886
842
887
$(P Many suspicious C constructs normally cause warnings to be emitted by default by
0 commit comments