Connecting Tech Pros Worldwide Help | Site Map

a typedef question

Fei Liu
Guest
 
Posts: n/a
#1: Apr 10 '07
Hello, this is a follow-up question I had about typedef usage in Gianni
Mariani's thread:
news://213.88.137.53:119/46198ecf$0$13145$5a62ac22@per-qv1-newsreader-01.iinet.net.au

int foo(int A, int * pA){ return 0; }
int main(){
typedef int * pi;
typedef int ii;
int a = sizeof(foo(ii(), pi()));
}


I understand the function foo never actually gets called, but what
causes the compiler to ignore this usage (without any actual storage
unit or variable declaration)? Normally one cannot call a function like
this. Also I didn't find any reference that sizeof can be used to take
the size of a function return type during compile time. I know what this
code is doing and it makes sense to me. But it seems like I can't find
any reference that says this is correct and proper use of C++ syntax.

This is the first time this kind of sizeof and typedef usage get my
attention, where I can read/learn about this typedef trick?

Thanks,

Fei
Victor Bazarov
Guest
 
Posts: n/a
#2: Apr 10 '07

re: a typedef question


Fei Liu wrote:
Quote:
[..]
int foo(int A, int * pA){ return 0; }
int main(){
typedef int * pi;
typedef int ii;
int a = sizeof(foo(ii(), pi()));
}
>
>
I understand the function foo never actually gets called, but what
causes the compiler to ignore this usage (without any actual storage
unit or variable declaration)?
5.3.3/1 Sizeof
"... The operand is either an expression *which is not evaluated* ..."
(emphasis mine).
Quote:
Normally one cannot call a function
like this.
Not sure what you meant by "normally". And how is it "like this"?
Temporaries of type 'ii' and 'pi' are constructed and passed to the
function. Just remove 'sizeof' and see what happens.
Quote:
Also I didn't find any reference that sizeof can be used
to take the size of a function return type during compile time.
Again, 5.3.3/1. What of "an expression" do you not get?
Quote:
I
know what this code is doing and it makes sense to me. But it seems
like I can't find any reference that says this is correct and proper
use of C++ syntax.
This is the first time this kind of sizeof and typedef usage get my
attention, where I can read/learn about this typedef trick?
WHAT typedef trick? You mean you never seen something like "blah()"
for 'blah' that is a type?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


Fei Liu
Guest
 
Posts: n/a
#3: Apr 10 '07

re: a typedef question


Victor Bazarov wrote:
Quote:
Fei Liu wrote:
Quote:
>[..]
>int foo(int A, int * pA){ return 0; }
>int main(){
> typedef int * pi;
> typedef int ii;
> int a = sizeof(foo(ii(), pi()));
>}
>>
>>
>I understand the function foo never actually gets called, but what
>causes the compiler to ignore this usage (without any actual storage
>unit or variable declaration)?
>
5.3.3/1 Sizeof
"... The operand is either an expression *which is not evaluated* ..."
(emphasis mine).
>
Quote:
>Normally one cannot call a function
>like this.
>
Not sure what you meant by "normally". And how is it "like this"?
Temporaries of type 'ii' and 'pi' are constructed and passed to the
function. Just remove 'sizeof' and see what happens.
>
Quote:
>Also I didn't find any reference that sizeof can be used
>to take the size of a function return type during compile time.
>
Again, 5.3.3/1. What of "an expression" do you not get?
>
Quote:
>I
>know what this code is doing and it makes sense to me. But it seems
>like I can't find any reference that says this is correct and proper
>use of C++ syntax.
>This is the first time this kind of sizeof and typedef usage get my
>attention, where I can read/learn about this typedef trick?
>
WHAT typedef trick? You mean you never seen something like "blah()"
for 'blah' that is a type?
>
V
Thanks for the pointer to 5.3.3/1 in the standard. But seriously, did
you forget to take your medicine?
Victor Bazarov
Guest
 
Posts: n/a
#4: Apr 10 '07

re: a typedef question


Fei Liu wrote:
Quote:
Victor Bazarov wrote:
Quote:
>Fei Liu wrote:
Quote:
>>[..]
>>int foo(int A, int * pA){ return 0; }
>>int main(){
>> typedef int * pi;
>> typedef int ii;
>> int a = sizeof(foo(ii(), pi()));
>>}
>>>
>>>
>>I understand the function foo never actually gets called, but what
>>causes the compiler to ignore this usage (without any actual storage
>>unit or variable declaration)?
>>
>5.3.3/1 Sizeof
>"... The operand is either an expression *which is not evaluated*
>..." (emphasis mine).
>>
Quote:
>>Normally one cannot call a function
>>like this.
>>
>Not sure what you meant by "normally". And how is it "like this"?
>Temporaries of type 'ii' and 'pi' are constructed and passed to the
>function. Just remove 'sizeof' and see what happens.
>>
Quote:
>>Also I didn't find any reference that sizeof can be used
>>to take the size of a function return type during compile time.
>>
>Again, 5.3.3/1. What of "an expression" do you not get?
>>
Quote:
>>I
>>know what this code is doing and it makes sense to me. But it seems
>>like I can't find any reference that says this is correct and proper
>>use of C++ syntax.
>>This is the first time this kind of sizeof and typedef usage get my
>>attention, where I can read/learn about this typedef trick?
>>
>WHAT typedef trick? You mean you never seen something like "blah()"
>for 'blah' that is a type?
>>
>V
>
Thanks for the pointer to 5.3.3/1 in the standard. But seriously, did
you forget to take your medicine?
What makes you think there is some medicine I am usually taking?
Are you a doctor?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


Old Wolf
Guest
 
Posts: n/a
#5: Apr 11 '07

re: a typedef question


On Apr 11, 5:50 am, Fei Liu <fei...@aepnetworks.comwrote:
Quote:
Victor Bazarov wrote:
Quote:
Fei Liu wrote:
Quote:
[..]
int foo(int A, int * pA){ return 0; }
int main(){
typedef int * pi;
typedef int ii;
int a = sizeof(foo(ii(), pi()));
}
>
Quote:
Quote:
This is the first time this kind of sizeof and typedef usage get my
attention, where I can read/learn about this typedef trick?
>
Quote:
WHAT typedef trick? You mean you never seen something like "blah()"
for 'blah' that is a type?
>
Thanks for the pointer to 5.3.3/1 in the standard. But seriously, did
you forget to take your medicine?
FWIW, I too have no idea what you meant by "typedef trick". The two
typedefs in the original code are pretty basic, it's hard to imagine
a simpler typedef. I also have no idea what you meant by:
Quote:
Quote:
Quote:
I understand the function foo never actually gets called, but what
causes the compiler to ignore this usage (without any actual storage
unit or variable declaration)?
unless perhaps, as Victor hypothesized, you aren't familiar
with the syntax T() for creating a temporary of type T, or
if you aren't aware that the sizeof operator can be applied
to any expression.

Can you explain?

#include <stdio.h>

int foo(int A, int * pA){ return 0; }
int main(){
typedef int * pi;
typedef int ii;
int a = sizeof foo(ii(), pi());
int b = foo(ii(), pi());
printf("a = %d, b = %d\n", a, b); /* probably 4, 0 */
return 0;
}

Closed Thread


Similar C / C++ bytes