将C预处理器宏转换为D模板或mixin

问题描述 投票:1回答:1

我正在努力将C库转换为D,我想知道在D中模仿以下C预处理器宏的最佳方法是什么。

#define LV2_ATOM_SEQUENCE_FOREACH(seq, iter) \
for (LV2_Atom_Event* (iter) = lv2_atom_sequence_begin(&(seq).body); \
    !lv2_atom_sequence_is_end(&(seq).body, (seq).atom.size, (iter)); \
    (iter) = lv2_atom_sequence_next(iter))

这甚至可以模仿D中的模板编程或mixin吗?

宏如何使用的一个例子是

LV2_ATOM_SEQUENCE_FOREACH(self->control, event) {
    do stuff with 'event'
    ...
}

我已经尝试过编写一个类似的模板,但我没有多少运气。

任何帮助或建议将不胜感激。

c-preprocessor d
1个回答
2
投票

经过大量的反复试验,我得到了它的工作。

void LV2_ATOM_OBJECT_FOREACH(const (LV2_Atom_Object*) obj, void delegate(LV2_Atom_Property_Body* prop) iterDelegate) 
{
    for (LV2_Atom_Property_Body* iter = lv2_atom_object_begin(&obj.body);
        !lv2_atom_object_is_end(&obj.body, obj.atom.size, iter);
        iter = lv2_atom_object_next(iter))
    {
        iterDelegate(iter);
    }
}

然后使用函数

LV2_ATOM_OBJECT_FOREACH(object, delegate(LV2_Atom_Property_Body* prop)
{
    ...use prop here...
});

我仍然不确定这是完全正确的。调用函数是extern(C)如果我尝试使LV2_ATOM_OBJECT_FOREACH extern(C)以及我得到以下错误

function dplug.lv2.atomutil.LV2_ATOM_OBJECT_FOREACH(const(LV2_Atom_Object*) obj, extern (C) void delegate(LV2_Atom_Property_Body* prop) iterDelegate) is not callable using argument types (const(LV2_Atom_Object*), void delegate(LV2_Atom_Property_Body* prop) nothrow @system)

非常感谢Adam关于如何解决这个问题的建议。

© www.soinside.com 2019 - 2024. All rights reserved.