[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c

Use of EXTERN

Tom Young

6/30/2011 8:38:00 PM

Hi all. I've read through all the K&R2 chapters and I'm now reading the
appendices.
Specifically, I'm reading section A11 - Scope & Linkage p227. I have a
question about the "extern" property.

Section A11.2 Linkage p228 says:

"All declarations for the same object or function identifier with external
linkage refer to the same thing, and the object or function is shared by
the entire program."

and

"... the first external declaration for an identifier gives the identifier
internal linkage if the static specifier is used, external linkage
otherwise."

My questions are, is there any point to declaration an external object
"extern"? Does it have any effect(s)? I'm almost positive I've seen code
with external declarations that included the keyword "extern", but given
the quoted statements above, that seems redundant. Am I missing
something?
2 Answers

pete

6/30/2011 9:38:00 PM

0

Tom Young wrote:
>
> Hi all. I've read through all the
> K&R2 chapters and I'm now reading the appendices.
> Specifically, I'm reading section A11 - Scope & Linkage p227.
> I have a question about the "extern" property.
>
> Section A11.2 Linkage p228 says:
>
> "All declarations for the same object or function identifier
> with external linkage refer to the same thing,
> and the object or function is shared by
> the entire program."
>
> and
>
> "... the first external declaration for an identifier
> gives the identifier
> internal linkage if the static specifier is used,
> external linkage otherwise."
>
> My questions are,
> is there any point to declaration an external object "extern"?
> Does it have any effect(s)?
> I'm almost positive I've seen code
> with external declarations that included the keyword "extern",
> but given
> the quoted statements above, that seems redundant. Am I missing
> something?

I have a program called "e_driver".

It consists of six files:
http://www.mindspring.com/~pfilandr/C/e_driver/...
http://www.mindspring.com/~pfilandr/C/e_driver/...
http://www.mindspring.com/~pfilandr/C/e_drive...
http://www.mindspring.com/~pfilandr/C/e_drive...
http://www.mindspring.com/~pfilandr/C/e_driver/e_distr...
http://www.mindspring.com/~pfilandr/C/e_driver/e_distr...

e_driver.c has this external declaration:
long unsigned cmp_count;

e_driver.h has this external declaration:
extern long unsigned cmp_count;

e_driver.c and e_sort.h and e_distributions.h
all have this line:
#include "e_driver.h"

e_sort.c has this line:
#include "e_sort.h
and e_distributions.c has this line:
#include "e_distributions.h"

All three of the *.c files in the e_driver program
use the same external object (cmp_count),
which is declared in e_driver.c

--
pete

James Kuyper

7/1/2011 11:11:00 AM

0

On 06/30/2011 04:38 PM, Tom Young wrote:
> Hi all. I've read through all the K&R2 chapters and I'm now reading the
> appendices.
> Specifically, I'm reading section A11 - Scope & Linkage p227. I have a
> question about the "extern" property.
>
> Section A11.2 Linkage p228 says:
>
> "All declarations for the same object or function identifier with external
> linkage refer to the same thing, and the object or function is shared by
> the entire program."
>
> and
>
> "... the first external declaration for an identifier gives the identifier
> internal linkage if the static specifier is used, external linkage
> otherwise."
>
> My questions are, is there any point to declaration an external object
> "extern"? Does it have any effect(s)? I'm almost positive I've seen code
> with external declarations that included the keyword "extern", but given
> the quoted statements above, that seems redundant. Am I missing
> something?

The problem is that, unless you use the keyword 'extern', the
declaration of an object will be treated as a tentative definition. If
no actual definition is present in the rest of the translation unit, a
tentative definition is automatically converted into an actual
definition, implicitly zero-initialized. (6.9.2p2)

C allows only one external definition of an identifier in an entire
program (6.9p3), so you can only allow the declaration to become a
definition in one translation unit. In all other translation units, you
must use the 'extern' keyword to keep it from converting into a definition.
--
James Kuyper