a typedef question

F

Fei Liu

Hello, this is a follow-up question I had about typedef usage in Gianni
Mariani's thread:

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
 
V

Victor Bazarov

Fei said:
[..]
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).
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.
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?
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
 
F

Fei Liu

Victor said:
Fei said:
[..]
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).
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.
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?
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?
 
V

Victor Bazarov

Fei said:
Victor said:
Fei said:
[..]
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).
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.
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?
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
 
O

Old Wolf

Victor said:
Fei said:
[..]
int foo(int A, int * pA){ return 0; }
int main(){
typedef int * pi;
typedef int ii;
int a = sizeof(foo(ii(), pi()));
}
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?

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:

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;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top