On 16/03/15 17:34, Marc Glisse wrote:
> On Mon, 16 Mar 2015, David Brown wrote:
> 
>> In a discussion on comp.lang.c, the subject of "named parameters" (or
>> "designated parameters") has come up again.  This is a feature that some
>> of us feel would be very useful in C (and in C++).  I think it would be
>> possible to include it in the language without leading to any conflicts
>> with existing code - it is therefore something that could be made as a
>> gcc extension, with a hope of adding it to the standards for a later C
>> standards revision.
>>
>> I wanted to ask opinions on the mailing list as to the feasibility of
>> the idea - there is little point in my cluttering up bugzilla with an
>> enhancement request if the gcc developers can spot obvious flaws in the
>> idea.
> 
> Filing a report in bugzilla would be quite useless: language extensions
> are now almost automatically rejected unless they come with a proposal
> that has already been favorably seen by the standardization committee.
> 

I'm glad I asked here first!

Another poster has told me that the C++ committee rejected the idea -
even though Mozilla's proposal was for C++ and slightly different
syntax, the same justification for rejection would apply to my suggested
syntax.

> On the other hand, implementing the feature (in your own fork) is almost
> a requirement if you intend to propose this for standardization. And it
> should not be too hard.

Certainly for the simplified version (where re-ordering is not allowed,
and code generation is not affected), it should be a relatively small
task.  However, for the way I work, I use multiple different gcc
versions and builds for different embedded targets - keeping separate
forks would not be feasible.  The only point of working on this in a
fork would be with the aim of integrating it into mainline gcc - and it
sounds like that is not going to happen.

A possibility would be to use a MELT plugin - that would be a little
more flexible.

> 
>> Basically, the idea is this:
>>
>> int foo(int a, int b, int c);
>>
>> void bar(void) {
>>     foo(1, 2, 3);    // Normal call
>>     foo(.a = 1, .b = 2, .c = 3)    // Same as foo(1, 2, 3)
>>     foo(.c = 3, .b = 2, .a = 1)    // Same as foo(1, 2, 3)
>> }
> 
> struct foo_args {
>   int a, b, c;
> };
> void foo(struct foo_args);
> #define foo(...) foo((struct foo_args){__VA_ARGS__})
> void g(){
>   foo(1,2,3);
>   foo(.c=3,.b=2);
> }

That has two main disadvantages.  First, because the argument is in a
struct, it is going to be harder or impossible for the compiler to
generate equally good code (for some of my uses, the difference between
passing arguments in registers and passing as a struct on the stack is
very significant).  And secondly, it would require a wrapper macro for
each function, rather than merely a prototype with parameter names
(which are typically already there in existing code).  But it is
certainly a possibility for functions with particularly large numbers of
arguments.

> 
> In C++ you could almost get away without the macro, calling f({1,2,3}),
> but f({.c=3}) currently gives "sorry, unimplemented". Maybe you would
> like to work on that?
> 
>> If only the first variant is allowed (with the named parameters in the
>> order declared in the prototype), then this would not affect code
>> generation at all - the designators could only be used for static error
>> checking.
>>
>> If the second variant is allowed, then the parameters could be
>> re-ordered.
>>
>>
>> The aim of this is to make it easier and safer to call functions with a
>> large number of parameters.  The syntax is chosen to match that of
>> designated initialisers - that should be clearer to the programmer, and
>> hopefully also make implementation easier.
>>
>> If there is more than one declaration of the function, then the
>> designators used should follow the most recent in-scope declaration.
> 
> An error may be safer, you would at least want a warning.

I'd be happy with that - I like to keep my prototypes consistent.  But I
know that some people are more flexible.

> 
>> This feature could be particularly useful when combined with default
>> arguments in C++, as it would allow the programmer to override later
>> default arguments without specifying all earlier arguments.
> 
> C++ is always more complicated (so many features can interact in strange
> ways), I suggest you start with C.
> 
>> At the moment, I am not asking for an implementation, or even /how/ it
>> might be implemented (perhaps a MELT plugin?) - I would merely like
>> opinions on whether it would be a useful and practical enhancement.
> 
> This is not such a good list for that, comp.lang.c is better suited.
> This will be a good list if you have technical issues implementing the
> feature.
> 

We've discussed it a little in comp.lang.c already, and of those who
expressed an opinion, most were positive to the idea.  But c.l.c. is for
people who /use/ compilers - this mailing list has people who /write/
compilers, and who understand how changes to the language are made - it
has thus been very useful to me to hear your viewpoint.

Obviously your reply was not the answer I had hoped for (which would be
"Great idea! We'll put it in the next version" :-) ), but it makes
sense, and helps me understand the gcc developers' position on such
things, as well as the C (and C++) committees' positions.  If Mozilla
can't persuade the C++ committee, then I'll just have to hope that
someone even bigger and more influential likes the idea!

So thank you for taking the time to reply,

David




Reply via email to