Sunday 31 December 2017

c - What is the difference between a definition and a declaration?

itemprop="text">

The meaning of both eludes
me.



itemprop="text">
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++.)



Thanks to href="https://stackoverflow.com/users/34509/johannes-schaub-litb">litb (Johannes
Schaub) who dug out the actual chapter and verse in one of his answers.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...