Sujet : Re: Help requested with P99-based macro to create Wayland listeners
De : david.brown (at) *nospam* hesbynett.no (David Brown)
Groupes : comp.lang.cDate : 10. Apr 2024, 10:05:55
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <uv5kpk$s1fr$1@dont-email.me>
References : 1 2 3 4 5
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0
On 09/04/2024 22:20, Blue-Maned_Hawk wrote:
David Brown wrote:
On 09/04/2024 20:17, Blue-Maned_Hawk wrote:
Tim Rentsch wrote:
>
What is it that you want to accomplish?
>
As i stated in the subject line, i am trying to create a macro to
create Wayland listeners.
>
>
Assume, for the sake of argument, that no one knows or cares anything
about Wayland or listeners.
<https://xkcd.com/1432/>
You are trying to use a set macros to expand to some code. Start by
showing what code you want to get from examples of using your macros -
then people can try to help get the macros right.
MAKE_LISTENER(wl_registry, global, global_remove);
→
static const struct wl_registry_listener wl_registry_listener = { .global
= callback_wl_registry_global, .global_remove =
callback_wl_registry_global_remove };
#define _get_6th_arg(_1, _2, _3, _4, _5, _arg, ...) _arg
#define _fe_0(_global, _call, ...)
#define _fe_1(_global, _call, x) _call(_global, x)
#define _fe_2(_global, _call, x, ...) _call(_global, x) _fe_1(_global, _call, __VA_ARGS__)
#define _fe_3(_global, _call, x, ...) _call(_global, x) _fe_2(_global, _call, __VA_ARGS__)
#define _fe_4(_global, _call, x, ...) _call(_global, x) _fe_3(_global, _call, __VA_ARGS__)
#define expand_macro_for_each(_global, _macro, ...) \
_get_6th_arg("ignored", __VA_ARGS__, \
_fe_4, _fe_3, _fe_2, _fe_1, _fe_0)(_global, _macro, __VA_ARGS__)
#define MAKE_LISTENER(object_type, ...) _make_listener(object_type, __VA_ARGS__)
#define _listener_entry(_global, _field) , . _field = callback_ ## _global ## _ ## field
#define _make_listener(object_type, first_field, ...) static const struct \
object_type ## _listener object_type ## _listener = { \
.first_field = callback_ ## object_type ## _ ## first_field \
expand_macro_for_each(object_type, _listener_entry, __VA_ARGS__) \
}