Mixed VisualD/C++ project

Mr.Bingo Bingo at Namo.com
Fri Jul 6 15:23:35 UTC 2018


Seems to be a bit weak. I just get a D hello world without any 
cross compilation. For the project, it would be better to have it 
setup to work properly using C++ as the master, since the other D 
projects provide the D side.

I was going to play around with using C++ and D together to see 
if I could get the best of both worlds but the test project only 
provides a bare bones D file. I created a cpp file and added it 
but I Get the error about stdafx. Seems like the project is not 
really setup properly to demonstrate using C++ and D together.

It would be better to have a small "hello world" mixed language 
demo.

In fact, what I'd like to ultimately do is provide a QT gui using 
C++ but a D business end.

The C++ file is programmed to use pre-compiled headers. Setting 
it to 'create' still has issues since none of the pch plumbing is 
taken care of.

I turned off precompiled headers and modified the code:

#include <cstdio>

void main()
{

	printf("hello world");
	getchar();
}


which gets the c++ called(renaming the D main to something else).


by externing and such I can call the D function after 
initializing the runtime.



This is the basic code I have now:


module WindowsApp2;

import std.stdio;
extern(C) int rt_init();
extern(C) int rt_term();

extern(C++) void test()
{
     rt_init();
     writeln("Hello D World!\n");
     getchar();

     rt_term();
}


and


#include <cstdio>


void test();

void main()
{

	printf("hello world");
	test();
	getchar();
}




This is what I'd like to see:

A C++/D mixed project with either the C++ or D as "master"(I 
believe this is just which one defines main) with proper 
initialization and pre-compiled headers. The above is a crude 
approximation of trying to do all that, but I'd expect it to be 
properly done.

The idea would be to provide the proper foundation of doing C++ 
and D mixed projects where very little trouble occurs and one can 
get the full benefit of each language and they interact well.

One of the key issues I think will occur, but not sure since I 
haven't done much C++ and D mixed, is cross referencing symbols 
and a lot of duplicate code must be created so the C++ side can 
see in to D and vice versa.

Maybe a tool can be automated that will take the D exports and 
automatically bring them in to C++ in a nice and easy way rather 
than duplicating code.

Maybe you could get some help of some people that do mixed C++ 
and D code to provide an optimal solution that works well? It 
would be cool if one could use C++ and D easily so that little 
work has to be done. This would alleviate many issues that D 
faces dealing with lack of proper libraries that are in C++. 
(while bindings exist they they generally rot over time and don't 
have all the flexibility that the main version has).


Also, it might be ideal to focus on such a mixed project and have 
the ability to simply set D as the "main" host. In such cases the 
project would reduce to a basic D project with the capabilities 
of adding C++ code. Even if C++ is master, which would require a 
c++ compiler, it can act just as a wrapper. (If Visual D can 
detect that no C++ file is used then it can ignore it)


The biggest thing that worries me is having to do all the 
plumbing between the two, which seems like it could be 
problematic for large projects... and it seems like a lot of this 
stuff could be automated.

e.g.,

    module testmod;

    extern(C++) test();

exports, from D, test.  In C++ we have to include test:

    void test();

this is not too much work, although it creates a dependency(if 
test is renamed then we have to rename all locations).

A few ways to solve this is to have visual D generate a list of 
all extern(C++) exports(or even use attributes to select them 
specifically) and then be able to import them in to C++

    #include "D_CppExports.h"

and D_CppExports.h is automatically created and includes void 
test();

This is not the best solution though as it would contain all the 
functions, might base it off the names of the modules:

    #include "D_CppExports_testmod.h"


Which, since it is automatically generated reduces the dependency 
issues significantly. (only if the module name changes will the 
break occur, which is an easy manual fix)

There might be better ways of doing this stuff, Some 
interlanguage libraries might be useful, for example, using a D 
template in C++ somehow and vice versa. (not sure if it is 
entirely possible but it would work in some cases)

With such a project that can act both as a C++ host and a D host 
there is really no need for the other project type. Allow for GDC 
in the project too.

Just throwing out ideas... I'm hoping getting in to the mixed 
side of things will open a lot of doors but I'm a bit weary it 
might be a lot more trouble than it's worth:

For example, https://dlang.org/spec/cpp_interface.html

using a D class E in C++ requires code duplication:

class E
{
   public:
     virtual int bar(int i, int j, int k);
};


it would be nice if Visual D could generate the C++ mapping 
automatically and then make it easy to import similar to the 
example above that imports a function.


Doing stuff like this reduces dependencies between the C++ and D 
side so that when one changes something on the D side they don't 
have to always go back and change it on the C++ side(which, at 
some point will become overwhelming). Instead, a simple utility 
handles all these dependencies in some way.




Thanks.


More information about the Digitalmars-d-ide mailing list