Is this portable?

Started by Alvaro Herreraalmost 19 years ago7 messages
#1Alvaro Herrera
alvherre@commandprompt.com

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

#2Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#1)
Re: Is this portable?

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. +

#3Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Alvaro Herrera (#1)
Re: Is this portable?

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

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Zdenek Kotala (#3)
Re: Is this portable?

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

#5Gregory Stark
stark@enterprisedb.com
In reply to: Tom Lane (#4)
Re: Is this portable?

"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

#6Alvaro Herrera
alvherre@commandprompt.com
In reply to: Gregory Stark (#5)
Re: Is this portable?

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

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Gregory Stark (#5)
Re: Is this portable?

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