digitalmars.D.learn - Transferring global variables from D to C
- Dainius (GreatEmerald) (30/30) Oct 01 2011 I'm testing how I could use globals in C, when using D as a library
I'm testing how I could use globals in C, when using D as a library and C as a frontend. So far it seems to be working well with some data types, but not so much with a few others. First of all, one obvious problem is strings, since they are a lot different in D. I can transfer them with a wrapper function like this (D code): immutable(char)* getString() { return toStringz(MyString); } However, this gets quite inefficient with a lot of different strings, and, if I understand how they work correctly, you also have to make sure the pointer points to the string you want if it changes in D by rerunning the function. That means that using a function instead of a variable breaks the flow of the code in C. It would be a pretty good solution if I could use a variable that automatically executes the function, something like this (D code): string MyString="a"; shared immutable(char)* a = () {return toStringz(MyString);}; But, of course, the compiler cannot compile it because it does not evaluate at compile time. So are there any more solutions to this? Struct packing can also be problematic, since if some members are not of the same length, then any members below those will always return 0. I have noticed that booleans, for example, translate to chars and not ints, and while they do work as ints, any struct members below the boolean will stop working. This is not mentioned in the documentation at all. I'm also not sure about how it would handle strings inside structs. Are they actually just pointers in D, which means that they only take the same amount of space in a struct as a regular char pointer?
Oct 01 2011