[FFmpeg-devel] [PATCH] fftools/ffmpeg_opt: Fix mixed declarations and code

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Fri Nov 8 15:31:00 EET 2019


Carl Eugen Hoyos:
> Am Mi., 6. Nov. 2019 um 13:18 Uhr schrieb Andreas Rheinhardt
> <andreas.rheinhardt at gmail.com>:
>>
>> Introduced in ed3c317d.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
>> ---
>>  fftools/ffmpeg_opt.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
>> index af9a9a6acb..f4ccf3f65e 100644
>> --- a/fftools/ffmpeg_opt.c
>> +++ b/fftools/ffmpeg_opt.c
>> @@ -3008,9 +3008,10 @@ static int opt_old2new(void *optctx, const char *opt, const char *arg)
>>  {
>>      OptionsContext *o = optctx;
>>      char *s = av_asprintf("%s:%c", opt + 1, *opt);
>> +    int ret;
> 
> Shouldn't the new declarations be above the call to av_asprintf()?
> 
> Carl Eugen

It is completely legal to perform an initialization via function call
in the middle of the declarations. I just reread the (relevant part
of) the standard and here comes the relevant language-lawyer-stuff.

The source of the ban on "mixed declarations and code" in C90 is the
syntax of compound statements (square brackets are used to denote
optional parts):

compound-statement:
    {  [declaration_list] [statement-list]  }

declaration-list
    declaration
    declaration-list declaration

statement-list
    statement
    statement-list statement

And the important parts of declaration are

    declarator = initializer

and

initializer
    assignment-expression
...

The syntax of assignment-expression is this:

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

Now the assignment-expression isn't what one might think: the "="
immediately following the declarator is already used and is therefore
not part of it, so that the first form of assignment-expression is used.
Now comes a series of types of expression that have two forms: One
that one would expect from common usage and a passthrough form. E.g.
here is the syntax for conditional-expression:

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

Of course the first form is used here. Via passthrough every
logical-OR-expression is a logical-AND-expression is an
inclusive-OR-expression is an exclusive-OR-expression is an
AND-expression is an equality-expression is a relational-expression is
a shift-expression is an additive-expression is a
multiplicative-expression is a cast-expression is a unary-expression
is a postfix-expression. And postfix-expressions have a function-call
form.

- Andreas


More information about the ffmpeg-devel mailing list