Deutsch English Français Italiano |
<vt93rd$3jj8k$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!eternal-september.org!.POSTED!not-for-mail From: BGB <cr88192@gmail.com> Newsgroups: comp.lang.c Subject: Re: "A diagram of C23 basic types" Date: Thu, 10 Apr 2025 13:47:42 -0500 Organization: A noiseless patient Spider Lines: 237 Message-ID: <vt93rd$3jj8k$1@dont-email.me> References: <87y0wjaysg.fsf@gmail.com> <vsj1m8$1f8h2$1@dont-email.me> <vsj2l9$1j0as$1@dont-email.me> <vsjef3$1u4nk$1@dont-email.me> <vsjg6t$20pdb$1@dont-email.me> <vsjgjn$1v1n4$1@dont-email.me> <vsjk4k$24q5m$1@dont-email.me> <vsjlcp$230a5$1@dont-email.me> <vsjmdl$277bk$1@dont-email.me> <VsdHP.1828827$TBhc.1078002@fx16.iad> <vskjlo$34st8$1@dont-email.me> <20250402220614.431@kylheku.com> <85mscxlqnb.fsf@nosuchdomain.example.com> <vsl9sn$3vdjj$2@dont-email.me> <20250403121946.134@kylheku.com> <vsms75$1i8ud$1@dont-email.me> <vsnhq6$291i3$4@dont-email.me> <20250409124900.00000fa1@yahoo.com> <vt5r34$inuo$7@dont-email.me> <vt6an7$13tvo$1@dont-email.me> <vt6gp0$16ejo$1@dont-email.me> <vt7te4$2hqe0$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 10 Apr 2025 20:49:18 +0200 (CEST) Injection-Info: dont-email.me; posting-host="8f70f4e52e0b2b3200bcfbc145cead94"; logging-data="3788052"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/72qv0powYxMSVO9MAVV0q2SAi2rmbucQ=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:Xcjz+yL4SFc+BTtQ5qvb/22/eo4= In-Reply-To: <vt7te4$2hqe0$1@dont-email.me> Content-Language: en-US Bytes: 11094 On 4/10/2025 2:53 AM, David Brown wrote: > On 09/04/2025 21:11, bart wrote: >> On 09/04/2025 18:26, BGB wrote: >>> On 4/9/2025 8:01 AM, David Brown wrote: >>>> On 09/04/2025 11:49, Michael S wrote: >>>>> On Fri, 4 Apr 2025 02:57:10 -0000 (UTC) >>>>> Lawrence D'Oliveiro <ldo@nz.invalid> wrote: >>>>> >>>>>> On Thu, 3 Apr 2025 21:48:40 +0100, bart wrote: >>>>>> >>>>>>> Commas are overwhelmingly used to separate list elements in >>>>>>> programming languages. >>>>>> >>>>>> Not just separate, but terminate. >>>>> >>>>> I disagree. I am in favor of optional trailing commas rather than >>>>> mandatory ones. >>>> >>>> I am certainly in favour of them for things like initialiser lists >>>> and enum declarations. >>>> >>>>> >>>>>> All the reasonable languages allow >>>>>> trailing commas. >>>>> >>>>> Are your sure that C Standard does not allow trailing commas? >>>>> That is, they are obviously legal in initializer lists. >>>>> All compilers that I tried reject trailing comma in function calls. >>>>> >>>> ... >>>>> But is it (rejection) really required by the Standard? I don't know. >>>>> >>>>> >>>> >>>> Yes. The syntax (in 6.5.2p1) is : >>>> >>>> postfix-expression: >>>> ... >>>> postfix-expression ( argument-expression-list opt ) >>>> ... >>>> >>>> argument-expression-list : >>>> argument-expression >>>> argument-expression-list , argument-expression >>>> >>>> >>>> >>>> I don't think it is unreasonable to suggest that it might be nice to >>>> allow a trailing comma, at least in variadic function calls, but the >>>> syntax of C does not allow it. >>>> >>> >>> Yeah, pretty much. >>> >>> >>> It might have also been interesting if C allowed optional named >>> arguments: >>> int foo(int x=3, int y=4) >>> { >>> return x+y; >>> } >>> >>> foo() => 7 >>> foo(.y=2) => 5 >>> >>> Likely would be following any fixed arguments (if present), and >>> likely (for sake of implementation sanity) named arguments and >>> varargs being mutually exclusive (alternative being that named >>> arguments precede varargs if both are used). >>> >>> Well, at least ".y=val" as "y: val" likely wouldn't go over well even >>> if it is what several other languages with this feature used (well >>> or, "y=val", which is used in some others). >>> >>> In the most likely case, the named argument form would be transformed >>> into the equivalent fixed argument form at compile time. >>> So: "foo(.y=2)" would be functionally equivalent to "foo(3,2)". >> >> There are all sorts of problems in adding this to C. For example, this >> is legal: >> >> void F(int a, float b, char* c); >> void F(int c, float a, char* b); >> void F(int b, float c, char* a) {} >> >> The sets of parameter names are all different (and that's in the same >> file!); which is the official set? > > C has had flexibility here for all sorts of reasons. But if named > parameters were to be added to the language without significant extra > syntax, then this particular issue could be solved in at least two very > simple ways. Either say that named parameter syntax can only be used if > all of the function's declarations in the translation unit have > consistent naming, or say that the last declaration in scope is the one > used. (My guess would be that the later, with compilers offering > warnings about the former.) > > Of course that lets someone declare "void f(int a, int b);" in one file > and "void f(int b, int a);" in a different one - but that does not > noticeably change the kind of mixups already available to the > undisciplined programmer, and it is completely eliminated by the > standard practice of using shared headers for declarations. > My likely rule here: If named arguments were used, the prototypes are required to match exactly (including names); At least within a translation unit. However, this would only apply to prototypes whose arguments have initializer values. So, those like in BartC's example would be unaffected (but, also, could not be used with names either). In cases where prototypes differ between translation units, it would be implementation defined. Most likely, it would depend on what was in effect at the call-site of the function. > >> >> Another is to do with defining default values (essential if named >> arguments are to be fully used). First, similar thing to the above: >> >> void F(int a = x + y); >> void F(int a = DEFAULT); >> > > Default arguments are most certainly not essential to make named > parameters useful. They /can/ be a nice thing to have, but they are > merely icing on the cake. Still, there is an obvious and C-friendly way > to handle this too - the default values must be constant expressions. > > A much clearer issue with a named parameter syntax like this is that > something like "foo(b = 1, a = 2);" is already valid in C and means > something significantly different. You'd need a different syntax. > > Fundamental matters such as this are best decided early in the design of > a language, rather than bolted on afterwards. Named parameters is > something I like in languages, but it's not easy to add to established > languages. > My thinking is that they would not change the behavior of existing functions or prototypes, but would incur new some rules when used. If a named argument is used, then it needs to have an assigned value, even if 0. Similarly, the initializer values would be required to be a compile-time constant (possibly with some additional limits relative to what is allowed for initializers for global variants, say only allowing for primitive literals but no compound literals nor taking the address of a variable or function). If no initializer is used, it is a fixed argument, and by extension may not be used as a named argument. So, for example: void foo1(float x, float y, float z); //fine, traditional void foo2(float x, float y=0, float z=0); //fine void foo3(float x, float y=0, float z); //bad, not allowed void foo4(float x=0, float y, float z); //bad, not allowed void foo5(float x=0, float y=0, float z=0); //fine Likewise: foo1(1,2,3); //fine foo1(.x=1, .y=2, .z=3); //bad, these are not named arguments ========== REMAINDER OF ARTICLE TRUNCATED ==========