В настоящее время я пытаюсь реализовать более чистый способ вызова собственных функций C из языка сценариев Gravity .
На данный момент наиболее простым примером будет этот:
int add(int lhs, int rhs) {
return lhs + rhs;
}
static void gravity_wrap_add(
gravity_vm* vm,
gravity_value_t* args, uint32_t nargs,
uint32_t retIndex, void* data
) {
int lhs, rhs, rt;
// Unwrap
lhs = VALUE_AS_INT(args[1]);
rhs = VALUE_AS_INT(args[2]);
// Perform call, capture return
rt = add(lhs, rhs);
// Forward the return
gravity_vm_setslot(vm, VALUE_FROM_INT(rt), retIndex);
}
Если бы с помощью шаблонов C ++ (98) или магии препроцессора C был бы способ генерировать функции-оболочки?:
static void gravity_wrap_add(
gravity_vm* vm,
gravity_value_t* args, uint32_t nargs,
uint32_t retIndex, void* data
) {
gravity_vm_setslot(vm,
VALUE_FROM_INT(
add(VALUE_AS_INT(args[1]), VALUE_AS_INT(args[2]))
),
retIndex);
}
Технически это то, чего я хочу достичь - но с помощью таких методов, как препроцессор или C ++.По причинам кросс-платформенной совместимости я бы хотел придерживаться C ++ 98 (поскольку MSVC не совсем хорош в современных функциях).