Есть ли способ вызвать функцию D из main () C или C ++? - PullRequest
1 голос
/ 16 апреля 2019

Я работаю над передачей сообщений для класса и хотел бы вызвать функцию D из main () из C или C ++.Я нашел много руководств по вызову функции C или C ++ из D main (), но как вы поступите иначе?

Я пробовал несколько ресурсов, таких как https://dlang.org/spec/cpp_interface.html и https://dlang.org/spec/interfaceToC.html


extern (C++) void foo(int num)
{
    //Does the FizzBuzz program
    for(int i = 0; i < num; i++){
     if(i%3 == 0)
        writeln("fizz");
     if(i%5 == 0)
        writeln("buzz");
     if(i%3 == 0 && num%5 == 0)
        writeln("Fizzbuzz");
    }
}

extern (C++) void bar();
void main()
{
    bar();
}

и код C ++

int foo(int i);

void bar()
{
    foo(100);
}

Спасибо за помощь!

1 Ответ

1 голос
/ 16 апреля 2019

Для простых вещей просто ссылка на libphobos:

$ cat main.cpp 
#include <stdio.h>

void foo(int num)
{
    //Does the FizzBuzz program
    for(int i = 0; i < num; i++){
     if(i%3 == 0)
        printf("fizz\n");
     if(i%5 == 0)
        printf("buzz\n");
     if(i%3 == 0 && num%5 == 0)
        printf("Fizzbuzz\n");
    }
}

void bar();

int main()
{
    bar();
    return 0;
}

$ cat foobar.d
extern(C++) int foo(int i);

extern(C++) void bar()
{
    foo(100);
}

$ dmd -c foobar.d

$ g++ main.cpp foobar.o -lphobos2

$ ./a.out | head
fizz
buzz
Fizzbuzz
fizz
Fizzbuzz
buzz
fizz
Fizzbuzz
fizz
Fizzbuzz

Это становится более сложным, если для работы кода D требуется среда выполнения D, например использование сборки мусора, и в этом случае время выполнения должно быть явно инициализировано.

...