By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,574 Members | 1,205 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,574 IT Pros & Developers. It's quick & easy.

a typedef question

P: n/a
Hello, this is a follow-up question I had about typedef usage in Gianni
Mariani's thread:
news://213.88.137.53:119/46***********************@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
Apr 10 '07 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Fei Liu wrote:
[..]
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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Apr 10 '07 #2

P: n/a
Victor Bazarov wrote:
Fei Liu wrote:
>[..]
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?
Apr 10 '07 #3

P: n/a
Fei Liu wrote:
Victor Bazarov wrote:
>Fei Liu wrote:
>>[..]
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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Apr 10 '07 #4

P: n/a
On Apr 11, 5:50 am, Fei Liu <fei...@aepnetworks.comwrote:
Victor Bazarov wrote:
Fei Liu wrote:
[..]
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:
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;
}

Apr 11 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.