Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Using sizeof without parentheses

Reply
Thread Tools

Using sizeof without parentheses

 
 
Chris McDonald
Guest
Posts: n/a
 
      04-10-2006
I've been trying to wean myself off using parentheses after the sizeof
operator (and after the return keyword, too), but my understanding is
challenged by the 4th use of sizeof in the following code:

#include <stdio.h>

struct {
int i;
char *p;
} var;

typedef struct {
int i;
char *p;
} TYPE;

int main(int argc, char *argv[])
{
printf("1: %d\n", sizeof var);
printf("2: %d\n", sizeof(var));

printf("3: %d\n", sizeof TYPE);
printf("4: %d\n", sizeof(TYPE));

return 0;
}

I understand that (TYPE) is not a value, so is the 3rd use of sizeof a
sort of 'special case' of what sizeof permits?
(gcc v4.0.1 and earlier, just to make this possibly OT)

A bit confused; Thanks,

--
Chris.
 
Reply With Quote
 
 
 
 
Vladimir S. Oka
Guest
Posts: n/a
 
      04-10-2006

Chris McDonald wrote:
> I've been trying to wean myself off using parentheses after the sizeof
> operator (and after the return keyword, too), but my understanding is
> challenged by the 4th use of sizeof in the following code:
>
> #include <stdio.h>
>
> struct {
> int i;
> char *p;
> } var;
>
> typedef struct {
> int i;
> char *p;
> } TYPE;
>
> int main(int argc, char *argv[])
> {
> printf("1: %d\n", sizeof var);


This is fine.

> printf("2: %d\n", sizeof(var));


No parenthesis required. Even if you opt for them, it's misleading to
"glue" them to `sizeof`.

> printf("3: %d\n", sizeof TYPE);


This is not allowed, as `TYPE` is a type and parenthesis are required.

If your compiler didn't pick this up, it's either broken, or you need
to turn the warning/error settings to a higher level.

> printf("4: %d\n", sizeof(TYPE));


This is as it should be.

> return 0;
> }
>
> I understand that (TYPE) is not a value, so is the 3rd use of sizeof a
> sort of 'special case' of what sizeof permits?
> (gcc v4.0.1 and earlier, just to make this possibly OT)


See above. (GCC may allow it as an extension, but it is OT.)

 
Reply With Quote
 
 
 
 
Chris McDonald
Guest
Posts: n/a
 
      04-10-2006
"Vladimir S. Oka" <(E-Mail Removed)> writes:

>Chris McDonald wrote:
>> printf("3: %d\n", sizeof TYPE);


>This is not allowed, as `TYPE` is a type and parenthesis are required.


>If your compiler didn't pick this up, it's either broken, or you need
>to turn the warning/error settings to a higher level.


>> printf("4: %d\n", sizeof(TYPE));


>This is as it should be.



Thanks Vladimir; gcc seems to be doing fine reporting #3 as an error,
even without any additional flags.

But I'm a little confused as to why if "... `TYPE` is a type"
that by placing parenthesis around the type name, that it's now OK?

--
Chris.
 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      04-10-2006
Chris McDonald wrote:

> I've been trying to wean myself off using parentheses after the sizeof
> operator (and after the return keyword, too), but my understanding is
> challenged by the 4th use of sizeof in the following code:
>
> #include <stdio.h>
>
> struct {
> int i;
> char *p;
> } var;
>
> typedef struct {
> int i;
> char *p;
> } TYPE;
>
> int main(int argc, char *argv[])
> {
> printf("1: %d\n", sizeof var);
> printf("2: %d\n", sizeof(var));
>
> printf("3: %d\n", sizeof TYPE);
> printf("4: %d\n", sizeof(TYPE));
>
> return 0;
> }
>
> I understand that (TYPE) is not a value, so is the 3rd use of sizeof a
> sort of 'special case' of what sizeof permits?
> (gcc v4.0.1 and earlier, just to make this possibly OT)
>
> A bit confused; Thanks,


The third use is an error for which the compiler must
issue a diagnostic. It is not some kind of special case
for sizeof; the construct simply doesn't work at all. (If
it works for your compiler, you are probably running the
compiler in a "C-with-extras" mode; gcc is famous/notorious
for creative departures from Standard C. Try using the
command-line options "-W -Wall -ansi -pedantic" or similar.)

By the way, "%d" is an incorrect conversion specifier for
the result of sizeof. "%d" must match an ordinary signed int,
but sizeof produces a size_t. The precise makeup of size_t
varies from one compiler to another, but it is certainly not
a signed value. I have used compilers where all of the examples
you show (except #3, which doesn't compile) would print zero.

--
Eric Sosman
http://www.velocityreviews.com/forums/(E-Mail Removed)lid
 
Reply With Quote
 
Vladimir S. Oka
Guest
Posts: n/a
 
      04-10-2006

Chris McDonald wrote:
> "Vladimir S. Oka" <(E-Mail Removed)> writes:
>
> >Chris McDonald wrote:
> >> printf("3: %d\n", sizeof TYPE);

>
> >This is not allowed, as `TYPE` is a type and parenthesis are required.

>
> >If your compiler didn't pick this up, it's either broken, or you need
> >to turn the warning/error settings to a higher level.

>
> >> printf("4: %d\n", sizeof(TYPE));

>
> >This is as it should be.

>
>
> Thanks Vladimir; gcc seems to be doing fine reporting #3 as an error,
> even without any additional flags.
>
> But I'm a little confused as to why if "... `TYPE` is a type"
> that by placing parenthesis around the type name, that it's now OK?


C99
6.5.3.4.2
The sizeof operator yields the size (in bytes) of its operand,
which may be an expression or the parenthesized name
of a type.

 
Reply With Quote
 
Chris McDonald
Guest
Posts: n/a
 
      04-10-2006
"Vladimir S. Oka" <(E-Mail Removed)> writes:

>C99
> 6.5.3.4.2
> The sizeof operator yields the size (in bytes) of its operand,
> which may be an expression or the parenthesized name
> of a type.


Thanks;

--
Chris.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
sizeof(EmptyStruct) in C and C++ (was: Base {}; sizeof(Base) == 1?) Alex Vinokur C Programming 7 08-14-2006 04:57 PM
sizeof( int ) != sizeof( void * ) blufox C Programming 2 05-22-2006 03:25 PM
#define ARR_SIZE sizeof(arr)/sizeof(arr[0]) Vinu C Programming 13 05-12-2005 06:00 PM
sizeof(enum) == sizeof(int) ??? Derek C++ 7 10-14-2004 05:11 PM
sizeof(str) or sizeof(str) - 1 ? Trevor C Programming 9 04-10-2004 05:07 PM



Advertisments