Path: ...!feeds.phibee-telecom.net!3.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch Newsgroups: comp.lang.c Subject: Re: is it possible to have functions with 0, 1, or 2 args? Date: Sun, 11 Aug 2024 22:15:52 -0700 Organization: A noiseless patient Spider Lines: 73 Message-ID: <861q2ugw3b.fsf@linuxsc.com> References: <7q-dnbTDU4oBES37nZ2dnZfqnPednZ2d@brightview.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Mon, 12 Aug 2024 07:15:56 +0200 (CEST) Injection-Info: dont-email.me; posting-host="f42e4005105099d89c60a754521770ce"; logging-data="3317302"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18xFPwXZeQzCgyXUiwK+ptEReNoVcSfMeY=" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:I/Zm6HPRAwz1Q8zqS34Tvj1mWnE= sha1:iZSKR1Qh8cvPryjHLvXqcy+xFeg= Bytes: 3068 Mark Summerfield writes: > Given > > ``` > // vaargs.h > #pragma once > > #define NARGS(...) NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1, 0) > #define NARGS_(_5, _4, _3, _2, _1, N, ...) N > > #define CONC(A, B) CONC_(A, B) > #define CONC_(A, B) A##B > > // va_test.h > #include "vaargs.h" > > #define va_test(...) CONC(va_test, NARGS(__VA_ARGS__))(__VA_ARGS__) > int va_test0(); > int va_test1(int); > int va_test2(int, int); > > // va_test.c > > #include "va_test.h" > > int va_test0() { return va_test2(3, 11); } > int va_test1(int a) { return va_test2(3, a); } > int va_test2(int a, int b) { return a + b; } > > // va_tests.c > #include "va_test.h" > #include > #include > > int main() { > int i = va_test(); > if (i != 14) { > fprintf(stderr, "FAIL: va_test() expecte 14 go %d\n", i); > } > i = va_test(5); > if (i != 8) { > fprintf(stderr, "FAIL: va_test() expecte 8 go %d\n", i); > } > i = va_test(2, 9); > if (i != 11) { > fprintf(stderr, "FAIL: va_test() expecte 11 go %d\n", i); > } > } > ``` > > This does *not* work for the `va_test()` call. But if I supply 1 or 2 args > it works great. > > The rational is that I'd like to create a function `new_thing()` which > takes an optional size, e.g., > > ``` > thing new_thing0() { return new_thing1(10); } > // above uses default size of 10 > thing new_thing1(int size) { ... } > ``` The short answer is, it is possible, from C99 onwards, to define a macro va_test(...) that does what you want. It isn't easy, but it is possible. If it's really important to define a macro that behaves like what you describe, and you can't find a suitable workaround, feel free to ask again and I can try to find and work through materials I have somewhere, to give an explanation of how to do what you want. Please note that I am making no guarantees about whether I can accomplish that, only that I can try to do so.