Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   confused between declaration & definition (http://www.velocityreviews.com/forums/t458247-confused-between-declaration-and-definition.html)

 arnuld 11-08-2006 09:08 AM

confused between declaration & definition

1) int i = 3;
2.) int* pi;
3.) int* pi2 = &i
4.) char* pc;
5.) char c;
6) char c2 = 'a'
7.) char* pc2 = &c2
8.) char* ps = "Stroustroup";
9.) extern double d;

2, 4 & 9 are the only declarations here. right ?

i know that 1, 3, 5, 6, 7, 8 are definitions but can we call them
declarations too?

Is 2 a legal declaration?

i dont understand the difference between 7 & 8.

 Alf P. Steinbach 11-08-2006 09:38 AM

Re: confused between declaration & definition

* arnuld:
> 1) int i = 3;
> 2.) int* pi;
> 3.) int* pi2 = &i
> 4.) char* pc;
> 5.) char c;
> 6) char c2 = 'a'
> 7.) char* pc2 = &c2
> 8.) char* ps = "Stroustroup";
> 9.) extern double d;
>
> 2, 4 & 9 are the only declarations here. right ?

All are declarations, but only 9 is a pure declaration (not a definition).

> i know that 1, 3, 5, 6, 7, 8 are definitions but can we call them
> declarations too?

Yes. Any definition is a declaration.

> Is 2 a legal declaration?

Yes.

> i dont understand the difference between 7 & 8.

7 declares a pointer to char and initializes it with the address of a
single char.

8 declares a pointer to char and initializes it with the address of the
first char in a zero-terminated sequence of chars (the string "Stroustrup").

8 is bad form (because it means you can try to modify a string literal
without the compiler detecting that error). It's only allowed in order
to have backwards compatibility with old C. Except for interfacing to
old C code that requires it, you should write

char const* ps = "Stroustrup";

or equivalently

const char* ps = "Stroustrup";

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?

 Kai-Uwe Bux 11-08-2006 09:48 AM

Re: confused between declaration & definition

arnuld wrote:

> 1) int i = 3;
> 2.) int* pi;
> 3.) int* pi2 = &i
> 4.) char* pc;
> 5.) char c;
> 6) char c2 = 'a'
> 7.) char* pc2 = &c2
> 8.) char* ps = "Stroustroup";
> 9.) extern double d;
>
> 2, 4 & 9 are the only declarations here. right ?

2 and 4 look like definitions to me.

> i know that 1, 3, 5, 6, 7, 8 are definitions but can we call them
> declarations too?

Yes, the standard defines [3.1/2]:

A declaration is a definition unless it declares a function without
specifying the function?s body (8.4), it contains the extern specifier
(7.1.1) or a linkage-specification (7.5) and neither an initializer nor
a function-body, it declares a static data member in a class declaration
(9.4), it is a class name declaration (9.1), or it is a typedef
declaration (7.1.3), a using-declaration (7.3.3), or a using-directive
(7.3.4).

As you can see, every definition is a declaration.

> Is 2 a legal declaration?

Looks legal to me. Did you run it by your compiler?

> i dont understand the difference between 7 & 8.

8 is a special case since the right hand side is really const. Usually, when
you define a T*, you are allowed to modify the pointee; and any attempt to
define a T* so that it points to a (an array of) T char should fail. In
order to support C code, there are special provisions for char*.

Best

Kai-Uwe Bux

 Victor Bazarov 11-08-2006 01:40 PM

Re: confused between declaration & definition

Alf P. Steinbach wrote:
> * arnuld:
>> 1) int i = 3;
>> 2.) int* pi;
>> 3.) int* pi2 = &i
>> 4.) char* pc;
>> 5.) char c;
>> 6) char c2 = 'a'
>> 7.) char* pc2 = &c2
>> 8.) char* ps = "Stroustroup";
>> 9.) extern double d;
>>
>> 2, 4 & 9 are the only declarations here. right ?

>
> All are declarations, but only 9 is a pure declaration (not a
> definition).

It depends on the context. 2, 4, 5, can also be declarations if
they happen to be inside a class definition.

>[..]

V
--