The meaning of both eludes
me.
class="normal">Answer
A
declaration introduces an identifier
and describes its type, be it a type, object, or function. A declaration is
what the compiler needs to accept
references to that identifier. These are declarations:
extern int bar;
extern
int g(int, int);
double f(int, double); // extern can be omitted for function
declarations
class foo; // no extern allowed for type
declarations
A
definition actually
instantiates/implements this identifier. It's what the linker
needs in order to link references to those entities. These are
definitions corresponding to the above declarations:
int bar;
int
g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return
i+d;}
class foo
{};
A definition can
be used in the place of a declaration.
An
identifier can be declared as often as you want. Thus, the
following is legal in C and C++:
double f(int,
double);
double f(int, double);
extern double f(int, double); // the
same as the two above
extern double f(int,
double);
However, it
must be defined exactly once. If you forget to define something
that's been declared and referenced somewhere, then the linker doesn't know what to link
references to and complains about a missing symbols. If you define something more than
once, then the linker doesn't know which of the definitions to link
references to and complains about duplicated symbols.
/>
Since the debate what is a class
declaration vs. a class definition in C++
keeps coming up (in answers and comments to other questions) , I'll paste a quote from
the C++ standard here.
At 3.1/2, C++03
says:
A
declaration is a definition unless it [...] is a class name declaration
[...].
3.1/3 then
gives a few examples. Amongst
them:
[Example:
[...]
struct S { int a; int b; }; // defines S, S::a, and S::b
[...]
struct S; // declares S
—end
example
To sum it up: The C++
standard considers struct x;
to be a
declaration and struct x {};
a
definition. (In other words, "forward
declaration" a misnomer, since there are no other forms of
class declarations in C++.)
No comments:
Post a Comment