Обсуждение: Is this portable?

Поиск
Список
Период
Сортировка

Is this portable?

От
Alvaro Herrera
Дата:
Can I declare a struct in a function's declaration section?  Something
like this:

static void
foobar(void)
{struct foo {    Oid        foo;    int        bar;};
struct foo baz;
baz.foo = InvalidOid;baz.bar = 42;

}

I tried here and GCC does not complain, with -std=c89 -pedantic.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


Re: Is this portable?

От
Bruce Momjian
Дата:
Alvaro Herrera wrote:
> Can I declare a struct in a function's declaration section?  Something
> like this:
> 
> static void
> foobar(void)
> {
>     struct foo {
>         Oid        foo;
>         int        bar;
>     };
> 
>     struct foo baz;
> 
>     baz.foo = InvalidOid;
>     baz.bar = 42;
> 
> }
> 
> I tried here and GCC does not complain, with -std=c89 -pedantic.

Sure.

--  Bruce Momjian  <bruce@momjian.us>          http://momjian.us EnterpriseDB
http://www.enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Is this portable?

От
Zdenek Kotala
Дата:
Alvaro Herrera wrote:
> Can I declare a struct in a function's declaration section?  Something
> like this:
> 
> static void
> foobar(void)
> {
>     struct foo {
>         Oid        foo;
>         int        bar;
>     };
> 
>     struct foo baz;
> 
>     baz.foo = InvalidOid;
>     baz.bar = 42;
> 
> }
> 
> I tried here and GCC does not complain, with -std=c89 -pedantic.
> 

It works fine with Sun Studio 11.
    Zdenek


Re: Is this portable?

От
Tom Lane
Дата:
Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> Alvaro Herrera wrote:
>> Can I declare a struct in a function's declaration section?

> It works fine with Sun Studio 11.

AFAICT it's required by the original K&R C book.
        regards, tom lane


Re: Is this portable?

От
Gregory Stark
Дата:
"Tom Lane" <tgl@sss.pgh.pa.us> writes:

> Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
>> Alvaro Herrera wrote:
>>> Can I declare a struct in a function's declaration section?
>
>> It works fine with Sun Studio 11.
>
> AFAICT it's required by the original K&R C book.

IIRC there's something odd about the scope of the declared struct label.

Something like it previously extended to the end of the file but post-ANSI was
limited to the scope it's declared in (including very limited scopes where it
would be useless such as in function parameters).


--  Gregory Stark EnterpriseDB          http://www.enterprisedb.com



Re: Is this portable?

От
Alvaro Herrera
Дата:
Gregory Stark wrote:
> "Tom Lane" <tgl@sss.pgh.pa.us> writes:
> 
> > Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> >> Alvaro Herrera wrote:
> >>> Can I declare a struct in a function's declaration section?
> >
> >> It works fine with Sun Studio 11.
> >
> > AFAICT it's required by the original K&R C book.
> 
> IIRC there's something odd about the scope of the declared struct label.
> 
> Something like it previously extended to the end of the file but post-ANSI was
> limited to the scope it's declared in (including very limited scopes where it
> would be useless such as in function parameters).

Hmm, thanks everybody.  I was just going to say "bummer!" because I
needed to build a qsort comparator for these, but then I realized that
it's better if I keep worker and launcher database structs separate --
the only field they use in common is the Oid anyway.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


Re: Is this portable?

От
Tom Lane
Дата:
Gregory Stark <stark@enterprisedb.com> writes:
> IIRC there's something odd about the scope of the declared struct label.

> Something like it previously extended to the end of the file but post-ANSI was
> limited to the scope it's declared in (including very limited scopes where it
> would be useless such as in function parameters).

I think you might be thinking of the use of a previously unreferenced
"struct foo" in a function declaration's parameter list, which is
something that did change (and so gcc warns about it).  But within a
block is not that case.
        regards, tom lane