Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <uv6fec$12hjm$1@dont-email.me>
Deutsch   English   Français   Italiano  
<uv6fec$12hjm$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED.247.92-221-34.customer.lyse.net!not-for-mail
From: David Brown <david.brown@hesbynett.no>
Newsgroups: comp.lang.c
Subject: Re: Help requested with P99-based macro to create Wayland listeners
Date: Wed, 10 Apr 2024 18:40:44 +0200
Organization: A noiseless patient Spider
Message-ID: <uv6fec$12hjm$1@dont-email.me>
References: <pan$3770d$7f0531e6$76520fa1$2c09330e@invalid.invalid>
 <86ttka1p61.fsf@linuxsc.com>
 <pan$325a1$29dc1a44$271afe6a$307a257b@invalid.invalid>
 <uv46mg$e1e0$1@dont-email.me>
 <pan$57aa8$bcee1756$62f53bf3$9223a50a@invalid.invalid>
 <uv5kpk$s1fr$1@dont-email.me> <87r0fdqnmi.fsf@bsb.me.uk>
 <86h6g919py.fsf@linuxsc.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Wed, 10 Apr 2024 16:40:44 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="247.92-221-34.customer.lyse.net:92.221.34.247";
	logging-data="1132150"; mail-complaints-to="abuse@eternal-september.org"
User-Agent: Mozilla Thunderbird
Content-Language: en-GB
In-Reply-To: <86h6g919py.fsf@linuxsc.com>
Bytes: 4150
Lines: 76

On 10/04/2024 18:08, Tim Rentsch wrote:
> Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
> 
>> David Brown <david.brown@hesbynett.no> writes:
>>
>>> 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
>>
>> s/field/_field/

Correct - sorry about the typo.

> 
> The bigger problem is that the proposed solution doesn't work
> for more than five fields.  

I have no idea how many fields the OP might want, in order to judge if 
that is a big problem or not.  But I believe he'll be able to figure out 
how to extend it as necessary.

> Clearly the idea is to define a
> macro that works for an unlimited number of fields, or at least
> a fairly large number.

If you have a way to extend it to unlimited numbers of fields, I would 
love to know - as far as I am aware, the lack of recursion or loops in 
the C pre-processor means that you always have to be limited like this. 
It is, I think, possible to make sequence of macros like this that split 
lists in half, so that you only need O(log N) submacros in order to 
support up to N arguments.  That would let you get to the level of very 
large numbers pretty quickly.