将 C 预处理器宏转换为 D 模板或 mixin
Translating C preprocessor macro to a D template or mixin
我正在努力将 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 中的模板编程或混合来模仿吗?
如何使用宏的示例是
LV2_ATOM_SEQUENCE_FOREACH(self->control, event) {
do stuff with 'event'
...
}
我试过编写一个模板来做类似的事情,但运气不太好。
如有任何帮助或建议,我们将不胜感激。
经过大量的尝试和错误,我让它工作了。
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 就如何解决此问题提出的建议。
我正在努力将 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 中的模板编程或混合来模仿吗?
如何使用宏的示例是
LV2_ATOM_SEQUENCE_FOREACH(self->control, event) {
do stuff with 'event'
...
}
我试过编写一个模板来做类似的事情,但运气不太好。
如有任何帮助或建议,我们将不胜感激。
经过大量的尝试和错误,我让它工作了。
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 就如何解决此问题提出的建议。