how to use the keyword extern in c?

Discussion in 'C Programming' started by ooze, Aug 25, 2004.

  1. ooze

    ooze Guest

    hi all ,
    anyone could tell me the useage of the keyworkd "extern" in c? and
    the difference between c & cplusplus?

    in the C99Rationalv5.10.pdf it lists 4 cases. while the first
    common cases will incur the vc compiler to complain.
    ooze, Aug 25, 2004
    #1
    1. Advertising

  2. ooze

    Jack Klein Guest

    On 24 Aug 2004 19:15:30 -0700, (ooze) wrote in
    comp.lang.c:

    > hi all ,
    > anyone could tell me the useage of the keyworkd "extern" in c?


    The extern keyword specifies that the identifier being declared has
    external linkage. This allows an object or function to be defined in
    one translation unit (basically, source file and everything it
    includes) and referred to by name from code in other translation
    units.

    > and
    > the difference between c & cplusplus?


    C++ is off-topic here, news:comp.lang.c++ is down the hall to the
    right.

    > in the C99Rationalv5.10.pdf it lists 4 cases. while the first
    > common cases will incur the vc compiler to complain.


    As to what Visual C++ might complain about, it might make a difference
    whether you are using it as a C or C++ compiler, as it handles both
    languages.

    The document you reference is not necessarily one that many people
    have.

    Even for those who do, like I do, your reference is far too vague.
    The document is well over 200 pages, and the word 'extern' appears
    many times. I spent a brief time looking in both the PDF and printed
    versions I have, and did not find the section you are referring to.

    Post again and include the specific section number from the document.
    That is, if you are indeed compiling C code and not C++. And for
    readers here who do not have a copy of the rationale, copy and paste
    the code sample you are referring to, and copy and paste the compiler
    or linker error messages as well.

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
    comp.lang.c++ http://www.parashift.com/c -faq-lite/
    alt.comp.lang.learn.c-c++
    http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html
    Jack Klein, Aug 25, 2004
    #2
    1. Advertising

  3. ooze

    ooze Guest

    Jack Klein <> wrote in message news:<>...
    > On 24 Aug 2004 19:15:30 -0700, (ooze) wrote in
    > comp.lang.c:
    >
    > > hi all ,
    > > anyone could tell me the useage of the keyworkd "extern" in c?

    >
    > The extern keyword specifies that the identifier being declared has
    > external linkage. This allows an object or function to be defined in
    > one translation unit (basically, source file and everything it
    > includes) and referred to by name from code in other translation
    > units.
    >
    > > and
    > > the difference between c & cplusplus?

    >
    > C++ is off-topic here, news:comp.lang.c++ is down the hall to the
    > right.
    >
    > > in the C99Rationalv5.10.pdf it lists 4 cases. while the first
    > > common cases will incur the vc compiler to complain.

    >
    > As to what Visual C++ might complain about, it might make a difference
    > whether you are using it as a C or C++ compiler, as it handles both
    > languages.
    >
    > The document you reference is not necessarily one that many people
    > have.
    >
    > Even for those who do, like I do, your reference is far too vague.
    > The document is well over 200 pages, and the word 'extern' appears
    > many times. I spent a brief time looking in both the PDF and printed
    > versions I have, and did not find the section you are referring to.
    >
    > Post again and include the specific section number from the document.
    > That is, if you are indeed compiling C code and not C++. And for
    > readers here who do not have a copy of the rationale, copy and paste
    > the code sample you are referring to, and copy and paste the compiler
    > or linker error messages as well.



    hallo,

    in section 6.2.2 Linkages of identifiers
    there is a table listed the 4 cases also includes detail info.

    what's the difference when the keyword "extern" appears and when it doest appear?
    for instance,
    +++++++++++++++++++++++++++++++
    extern int var1; | int var1;
    _______________________________
    extern void func(); | void func();

    in a c file.
    ooze, Aug 25, 2004
    #3
  4. ooze

    ooze Guest

    Jack Klein <> wrote in message news:<>...
    > On 24 Aug 2004 19:15:30 -0700, (ooze) wrote in
    > comp.lang.c:
    >
    > > hi all ,
    > > anyone could tell me the useage of the keyworkd "extern" in c?

    >
    > The extern keyword specifies that the identifier being declared has
    > external linkage. This allows an object or function to be defined in
    > one translation unit (basically, source file and everything it
    > includes) and referred to by name from code in other translation
    > units.
    >
    > > and
    > > the difference between c & cplusplus?

    >
    > C++ is off-topic here, news:comp.lang.c++ is down the hall to the
    > right.
    >
    > > in the C99Rationalv5.10.pdf it lists 4 cases. while the first
    > > common cases will incur the vc compiler to complain.

    >
    > As to what Visual C++ might complain about, it might make a difference
    > whether you are using it as a C or C++ compiler, as it handles both
    > languages.
    >
    > The document you reference is not necessarily one that many people
    > have.
    >
    > Even for those who do, like I do, your reference is far too vague.
    > The document is well over 200 pages, and the word 'extern' appears
    > many times. I spent a brief time looking in both the PDF and printed
    > versions I have, and did not find the section you are referring to.
    >
    > Post again and include the specific section number from the document.
    > That is, if you are indeed compiling C code and not C++. And for
    > readers here who do not have a copy of the rationale, copy and paste
    > the code sample you are referring to, and copy and paste the compiler
    > or linker error messages as well.




    hallo,

    in section 6.2.2 Linkages of identifiers
    there is a table listed the 4 cases also includes detail info.

    what's the difference when the keyword "extern" appears and when it doest appear?
    for instance,
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    extern int var1; | int var1;
    _____________________________________________________________
    extern int var1 = 0x0bad | int var1 = 0x0bad
    _____________________________________________________________
    extern void func(); | void func();
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    in a c file.
    ooze, Aug 25, 2004
    #4
  5. ooze

    Dan Pop Guest

    In <> (ooze) writes:

    >what's the difference when the keyword "extern" appears and when it doest appear?
    >for instance,


    Assuming all declarations have file scope:

    >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    > extern int var1; | int var1;


    declaration, external linkage tentative external definition

    >_____________________________________________________________
    >extern int var1 = 0x0bad; | int var1 = 0x0bad;


    external definition external definition

    >_____________________________________________________________
    >extern void func(); | void func();


    declaration, external linkage declaration, external linkage

    As you can see, the only context where extern makes any difference is
    in object declarations that are not intended to be definitions. Otherwise
    it can be omitted in file scope declarations, because it is the default.

    Dan
    --
    Dan Pop
    DESY Zeuthen, RZ group
    Email:
    Dan Pop, Aug 25, 2004
    #5
  6. ooze

    ooze Guest

    (Dan Pop) wrote in message news:<cgiamm$q3q$>...
    > In <> (ooze) writes:
    >
    > >what's the difference when the keyword "extern" appears and when it doest appear?
    > >for instance,

    >
    > Assuming all declarations have file scope:
    >
    > >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    > > extern int var1; | int var1;

    >
    > declaration, external linkage tentative external definition
    >
    > >_____________________________________________________________
    > >extern int var1 = 0x0bad; | int var1 = 0x0bad;

    >
    > external definition external definition
    >
    > >_____________________________________________________________
    > >extern void func(); | void func();

    >
    > declaration, external linkage declaration, external linkage
    >
    > As you can see, the only context where extern makes any difference is
    > in object declarations that are not intended to be definitions. Otherwise
    > it can be omitted in file scope declarations, because it is the default.
    >
    > Dan


    thanks, as you stated,
    I remember in C the defintion of an object can ONLY occur ONLY ONCE.

    but if I write extern int var1 = 0x0bad ; in one.c,
    and write extern int var1 = 0xdead; in another.c
    the vc c compiler will happy accept it.

    since you think

    > >_____________________________________________________________
    > >extern int var1 = 0x0bad; | int var1 = 0x0bad;

    >
    > external definition external definition


    how to explain it?

    thanks
    ooze, Aug 26, 2004
    #6
  7. ooze

    Jack Klein Guest

    On 25 Aug 2004 18:37:26 -0700, (ooze) wrote in
    comp.lang.c:

    > (Dan Pop) wrote in message news:<cgiamm$q3q$>...
    > > In <> (ooze) writes:
    > >
    > > >what's the difference when the keyword "extern" appears and when it doest appear?
    > > >for instance,

    > >
    > > Assuming all declarations have file scope:
    > >
    > > >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    > > > extern int var1; | int var1;

    > >
    > > declaration, external linkage tentative external definition
    > >
    > > >_____________________________________________________________
    > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;

    > >
    > > external definition external definition
    > >
    > > >_____________________________________________________________
    > > >extern void func(); | void func();

    > >
    > > declaration, external linkage declaration, external linkage
    > >
    > > As you can see, the only context where extern makes any difference is
    > > in object declarations that are not intended to be definitions. Otherwise
    > > it can be omitted in file scope declarations, because it is the default.
    > >
    > > Dan

    >
    > thanks, as you stated,
    > I remember in C the defintion of an object can ONLY occur ONLY ONCE.
    >
    > but if I write extern int var1 = 0x0bad ; in one.c,
    > and write extern int var1 = 0xdead; in another.c
    > the vc c compiler will happy accept it.
    >
    > since you think
    >
    > > >_____________________________________________________________
    > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;

    > >
    > > external definition external definition

    >
    > how to explain it?
    >
    > thanks


    There are a lot of technical details about different models of linking
    that is used by the linkers of different implementations on different
    platforms. Some of them will allow multiple definitions of an
    external symbol, as long as no more than one of them has an
    initializer.

    The C standard requires that any object or function with external
    linkage that is not actually referenced in the program must have
    exactly 0 or 1 definitions somewhere in the program. Any object
    or function with external linkage that is actually referenced in a
    program must have exactly 1 definition, no more and no less.

    A violation of this requirement causes undefined behavior, and
    compilers are never required to diagnose undefined behavior.

    Any compiler should be able to compile the two source files with two
    external definitions of 'var1', both with initializers. The error
    should come when the two object files are linked together to make the
    program.

    I don't know of any version of Microsoft's Visual C++, or any other C
    compiler for that matter, that will not generate an error if those two
    source files are put into a single program.

    Here is what I got from Visual C++ 6.0:

    --------------------Configuration: multi - Win32
    Debug--------------------
    Linking...
    multi2.obj : error LNK2005: _var1 already defined in multi1.obj
    multi___Win32_Debug/multi.exe : fatal error LNK1169: one or more
    multiply defined symbols found
    Error executing link.exe.

    multi.exe - 2 error(s), 0 warning(s)

    And here is what I got from the Visual C++ 2005 Express Edition Beta:

    ------ Build started: Project: multi, Configuration: Debug Win32
    ------
    Compiling...
    multi2.c
    Linking...
    multi1.obj : error LNK2005: _var1 already defined in multi2.obj
    Debug/multi.exe : fatal error LNK1169: one or more multiply defined
    symbols found
    Build log was saved at "file://c:\Program Files\Microsoft Visual
    Studio 8\projects\multi\multi\Debug\BuildLog.htm"
    multi - 2 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
    ==========

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
    comp.lang.c++ http://www.parashift.com/c -faq-lite/
    alt.comp.lang.learn.c-c++
    http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html
    Jack Klein, Aug 26, 2004
    #7
  8. ooze

    ooze Guest

    Jack Klein <> wrote in message news:<>...
    > On 25 Aug 2004 18:37:26 -0700, (ooze) wrote in
    > comp.lang.c:
    >
    > > (Dan Pop) wrote in message news:<cgiamm$q3q$>...
    > > > In <> (ooze) writes:
    > > >
    > > > >what's the difference when the keyword "extern" appears and when it doest appear?
    > > > >for instance,
    > > >
    > > > Assuming all declarations have file scope:
    > > >
    > > > >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    > > > > extern int var1; | int var1;
    > > >
    > > > declaration, external linkage tentative external definition
    > > >
    > > > >_____________________________________________________________
    > > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;
    > > >
    > > > external definition external definition
    > > >
    > > > >_____________________________________________________________
    > > > >extern void func(); | void func();
    > > >
    > > > declaration, external linkage declaration, external linkage
    > > >
    > > > As you can see, the only context where extern makes any difference is
    > > > in object declarations that are not intended to be definitions. Otherwise
    > > > it can be omitted in file scope declarations, because it is the default.
    > > >
    > > > Dan

    > >
    > > thanks, as you stated,
    > > I remember in C the defintion of an object can ONLY occur ONLY ONCE.
    > >
    > > but if I write extern int var1 = 0x0bad ; in one.c,
    > > and write extern int var1 = 0xdead; in another.c
    > > the vc c compiler will happy accept it.
    > >
    > > since you think
    > >
    > > > >_____________________________________________________________
    > > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;
    > > >
    > > > external definition external definition

    > >
    > > how to explain it?
    > >
    > > thanks

    >
    > There are a lot of technical details about different models of linking
    > that is used by the linkers of different implementations on different
    > platforms. Some of them will allow multiple definitions of an
    > external symbol, as long as no more than one of them has an
    > initializer.
    >
    > The C standard requires that any object or function with external
    > linkage that is not actually referenced in the program must have
    > exactly 0 or 1 definitions somewhere in the program. Any object
    > or function with external linkage that is actually referenced in a
    > program must have exactly 1 definition, no more and no less.
    >
    > A violation of this requirement causes undefined behavior, and
    > compilers are never required to diagnose undefined behavior.
    >
    > Any compiler should be able to compile the two source files with two
    > external definitions of 'var1', both with initializers. The error
    > should come when the two object files are linked together to make the
    > program.
    >
    > I don't know of any version of Microsoft's Visual C++, or any other C
    > compiler for that matter, that will not generate an error if those two
    > source files are put into a single program.
    >
    > Here is what I got from Visual C++ 6.0:
    >
    > --------------------Configuration: multi - Win32
    > Debug--------------------
    > Linking...
    > multi2.obj : error LNK2005: _var1 already defined in multi1.obj
    > multi___Win32_Debug/multi.exe : fatal error LNK1169: one or more
    > multiply defined symbols found
    > Error executing link.exe.
    >
    > multi.exe - 2 error(s), 0 warning(s)
    >
    > And here is what I got from the Visual C++ 2005 Express Edition Beta:
    >
    > ------ Build started: Project: multi, Configuration: Debug Win32
    > ------
    > Compiling...
    > multi2.c
    > Linking...
    > multi1.obj : error LNK2005: _var1 already defined in multi2.obj
    > Debug/multi.exe : fatal error LNK1169: one or more multiply defined
    > symbols found
    > Build log was saved at "file://c:\Program Files\Microsoft Visual
    > Studio 8\projects\multi\multi\Debug\BuildLog.htm"
    > multi - 2 error(s), 0 warning(s)
    > ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
    > ==========



    what's the difference between
    "tentative external definition" &

    "external definition"?

    vc will accept if one object defined twice with the above respectivly.
    ooze, Aug 26, 2004
    #8
  9. ooze

    ooze Guest

    Jack Klein <> wrote in message news:<>...
    > On 25 Aug 2004 18:37:26 -0700, (ooze) wrote in
    > comp.lang.c:
    >
    > > (Dan Pop) wrote in message news:<cgiamm$q3q$>...
    > > > In <> (ooze) writes:
    > > >
    > > > >what's the difference when the keyword "extern" appears and when it doest appear?
    > > > >for instance,
    > > >
    > > > Assuming all declarations have file scope:
    > > >
    > > > >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    > > > > extern int var1; | int var1;
    > > >
    > > > declaration, external linkage tentative external definition
    > > >
    > > > >_____________________________________________________________
    > > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;
    > > >
    > > > external definition external definition
    > > >
    > > > >_____________________________________________________________
    > > > >extern void func(); | void func();
    > > >
    > > > declaration, external linkage declaration, external linkage
    > > >
    > > > As you can see, the only context where extern makes any difference is
    > > > in object declarations that are not intended to be definitions. Otherwise
    > > > it can be omitted in file scope declarations, because it is the default.
    > > >
    > > > Dan

    > >
    > > thanks, as you stated,
    > > I remember in C the defintion of an object can ONLY occur ONLY ONCE.
    > >
    > > but if I write extern int var1 = 0x0bad ; in one.c,
    > > and write extern int var1 = 0xdead; in another.c
    > > the vc c compiler will happy accept it.
    > >
    > > since you think
    > >
    > > > >_____________________________________________________________
    > > > >extern int var1 = 0x0bad; | int var1 = 0x0bad;
    > > >
    > > > external definition external definition

    > >
    > > how to explain it?
    > >
    > > thanks

    >
    > There are a lot of technical details about different models of linking
    > that is used by the linkers of different implementations on different
    > platforms. Some of them will allow multiple definitions of an
    > external symbol, as long as no more than one of them has an
    > initializer.
    >
    > The C standard requires that any object or function with external
    > linkage that is not actually referenced in the program must have
    > exactly 0 or 1 definitions somewhere in the program. Any object
    > or function with external linkage that is actually referenced in a
    > program must have exactly 1 definition, no more and no less.
    >
    > A violation of this requirement causes undefined behavior, and
    > compilers are never required to diagnose undefined behavior.
    >
    > Any compiler should be able to compile the two source files with two
    > external definitions of 'var1', both with initializers. The error
    > should come when the two object files are linked together to make the
    > program.
    >
    > I don't know of any version of Microsoft's Visual C++, or any other C
    > compiler for that matter, that will not generate an error if those two
    > source files are put into a single program.
    >
    > Here is what I got from Visual C++ 6.0:
    >
    > --------------------Configuration: multi - Win32
    > Debug--------------------
    > Linking...
    > multi2.obj : error LNK2005: _var1 already defined in multi1.obj
    > multi___Win32_Debug/multi.exe : fatal error LNK1169: one or more
    > multiply defined symbols found
    > Error executing link.exe.
    >
    > multi.exe - 2 error(s), 0 warning(s)
    >
    > And here is what I got from the Visual C++ 2005 Express Edition Beta:
    >
    > ------ Build started: Project: multi, Configuration: Debug Win32
    > ------
    > Compiling...
    > multi2.c
    > Linking...
    > multi1.obj : error LNK2005: _var1 already defined in multi2.obj
    > Debug/multi.exe : fatal error LNK1169: one or more multiply defined
    > symbols found
    > Build log was saved at "file://c:\Program Files\Microsoft Visual
    > Studio 8\projects\multi\multi\Debug\BuildLog.htm"
    > multi - 2 error(s), 0 warning(s)
    > ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
    > ==========



    if int var1; defined in one.c, and extern int var1=23; defined in
    another.c.
    vc will accept it.
    vc will also accept
    1) int var1 in one.c and int var1 in another.c
    2) int var1 in one.c and int var1 = 23 in another.c

    it seems to me that in a program an object can have mutiple tentative
    definitions, but only one external definition.
    ooze, Aug 26, 2004
    #9
  10. ooze

    Dan Pop Guest

    In <> (ooze) writes:

    >if int var1; defined in one.c, and extern int var1=23; defined in
    >another.c.
    >vc will accept it.
    >vc will also accept
    >1) int var1 in one.c and int var1 in another.c
    >2) int var1 in one.c and int var1 = 23 in another.c


    Assuming all declarations have file scope, there are two external
    definitions for var1 in all your examples.

    >it seems to me that in a program an object can have mutiple tentative
    >definitions, but only one external definition.


    Only fools try to figure out how the language works from the behaviour of
    their compilers. If multiple definitions of an object cause undefined
    behaviour, any implementation is free to silently accept them. And,
    according to Annex J.2 (I'm too lazy to search the chapter and verse):

    - An identifier with external linkage is used, but in the program
    there does not exist exactly one external definition for the
    identifier, or the identifier is not used and there exist
    multiple external definitions for the identifier (6.9).

    So, VC is free to silently accept as many external definitions for var1
    as you provide. But the behaviour of your program is undefined, if it
    provides more than one.

    A tentative definition becomes a genuine definition at the end of the
    translation unit, if not superseded by another definition for the same
    object. This is why it is called "tentative" definition. So, your
    conclusion is valid only for one translation unit (C source file plus
    whatever stuff is included via #include directives), not for a complete
    program containing multiple definitions for the same object in multiple
    translation units.

    Dan
    --
    Dan Pop
    DESY Zeuthen, RZ group
    Email:
    Dan Pop, Aug 26, 2004
    #10
  11. ooze

    ooze Guest

    (Dan Pop) wrote in message news:<cgklum$dfo$>...
    > In <> (ooze) writes:
    >
    > >if int var1; defined in one.c, and extern int var1=23; defined in
    > >another.c.
    > >vc will accept it.
    > >vc will also accept
    > >1) int var1 in one.c and int var1 in another.c
    > >2) int var1 in one.c and int var1 = 23 in another.c

    >
    > Assuming all declarations have file scope, there are two external
    > definitions for var1 in all your examples.
    >
    > >it seems to me that in a program an object can have mutiple tentative
    > >definitions, but only one external definition.

    >
    > Only fools try to figure out how the language works from the behaviour of
    > their compilers. If multiple definitions of an object cause undefined
    > behaviour, any implementation is free to silently accept them. And,
    > according to Annex J.2 (I'm too lazy to search the chapter and verse):
    >
    > - An identifier with external linkage is used, but in the program
    > there does not exist exactly one external definition for the
    > identifier, or the identifier is not used and there exist
    > multiple external definitions for the identifier (6.9).
    >
    > So, VC is free to silently accept as many external definitions for var1
    > as you provide. But the behaviour of your program is undefined, if it
    > provides more than one.
    >
    > A tentative definition becomes a genuine definition at the end of the
    > translation unit, if not superseded by another definition for the same
    > object. This is why it is called "tentative" definition. So, your
    > conclusion is valid only for one translation unit (C source file plus
    > whatever stuff is included via #include directives), not for a complete
    > program containing multiple definitions for the same object in multiple
    > translation units.
    >
    > Dan


    I don't have a C Standard at hand, could you excerpt the usage of
    extern keyword from the Standard? thanks.

    till now, I don't know what's right usage of the keyword. I don't want
    to write a program depending on a specific compiler. if I can write
    codes according to C Standard, I think it would be easy to port to
    other OS, compiler.
    ooze, Aug 27, 2004
    #11
  12. ooze

    CBFalconer Guest

    ooze wrote:
    >

    .... snip ...
    >
    > till now, I don't know what's right usage of the keyword. I don't
    > want to write a program depending on a specific compiler. if I can
    > write codes according to C Standard, I think it would be easy to
    > port to other OS, compiler.


    I suggest you follow this simple rule in each .c .h file pair:

    1. Mark all file scope variables as static, unless:
    1a. You want to access them from some other file, when you
    don't mark them static, and you do list them in the
    associated .h file as extern.
    2. Mark all functions as static, unless:
    2a. You want to call them from some other file, when you
    don't mark them as static, and you do put their
    prototypes in the .h file. No extern needed.

    Note that this is for files whose storage is primarily associated
    with the .c file. Think of the .h file as a means of exporting
    things that you want other modules to know about and access.

    Similarly, where you put #defines and the ilk is dependent on who
    needs to know. By confining them to the .c file you make their
    scope local.

    --
    Chuck F () ()
    Available for consulting/temporary embedded and systems.
    <http://cbfalconer.home.att.net> USE worldnet address!
    CBFalconer, Aug 27, 2004
    #12
  13. ooze

    ooze Guest

    CBFalconer <> wrote in message news:<>...
    > ooze wrote:
    > >

    > ... snip ...
    > >
    > > till now, I don't know what's right usage of the keyword. I don't
    > > want to write a program depending on a specific compiler. if I can
    > > write codes according to C Standard, I think it would be easy to
    > > port to other OS, compiler.

    >
    > I suggest you follow this simple rule in each .c .h file pair:
    >
    > 1. Mark all file scope variables as static, unless:
    > 1a. You want to access them from some other file, when you
    > don't mark them static, and you do list them in the
    > associated .h file as extern.
    > 2. Mark all functions as static, unless:
    > 2a. You want to call them from some other file, when you
    > don't mark them as static, and you do put their
    > prototypes in the .h file. No extern needed.
    >
    > Note that this is for files whose storage is primarily associated
    > with the .c file. Think of the .h file as a means of exporting
    > things that you want other modules to know about and access.
    >
    > Similarly, where you put #defines and the ilk is dependent on who
    > needs to know. By confining them to the .c file you make their
    > scope local.



    your method is good only for writting code by yourself. you can not
    tell whether the code written by others is right or wrong, so it is
    good if I could have a copy of the C Standard which giving the rules
    what is right, what is undefined, what's wrong.
    ooze, Aug 27, 2004
    #13
  14. ooze

    Dan Pop Guest

    In <> (ooze) writes:

    >your method is good only for writting code by yourself. you can not
    >tell whether the code written by others is right or wrong, so it is
    >good if I could have a copy of the C Standard which giving the rules
    >what is right, what is undefined, what's wrong.


    Anything wrong with K&R2?

    Dan
    --
    Dan Pop
    DESY Zeuthen, RZ group
    Email:
    Dan Pop, Aug 27, 2004
    #14
  15. ooze

    ooze Guest

    (Dan Pop) wrote in message news:<cgnm8a$n35$>...
    > In <> (ooze) writes:
    >
    > >your method is good only for writting code by yourself. you can not
    > >tell whether the code written by others is right or wrong, so it is
    > >good if I could have a copy of the C Standard which giving the rules
    > >what is right, what is undefined, what's wrong.

    >
    > Anything wrong with K&R2?
    >
    > Dan


    I didn't say anything wrong about K&R. I was talking about how to
    judge whether the code write by others is right or not, Sir.

    Anyone can post the usage of extern from the C Standard, don't state
    them yourself.
    ooze, Aug 28, 2004
    #15
  16. ooze

    CBFalconer Guest

    ooze wrote:
    > (Dan Pop) wrote
    >> (ooze) writes:
    >>
    >>> your method is good only for writting code by yourself. you can
    >>> not tell whether the code written by others is right or wrong,
    >>> so it is good if I could have a copy of the C Standard which
    >>> giving the rules what is right, what is undefined, what's wrong.

    >>
    >> Anything wrong with K&R2?

    >
    > I didn't say anything wrong about K&R. I was talking about how to
    > judge whether the code write by others is right or not, Sir.
    >
    > Anyone can post the usage of extern from the C Standard, don't
    > state them yourself.


    My, someone is touchy and bites the hand that feeds. The point of
    K&R2 is that it will explain things much better than digging
    through the standard. I believe you have been told how to get
    various versions of the standard already, so go and do your own
    investigating.

    --
    A: Because it fouls the order in which people normally read text.
    Q: Why is top-posting such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?
    CBFalconer, Aug 28, 2004
    #16
  17. ooze

    Dan Pop Guest

    In <> (ooze) writes:

    > (Dan Pop) wrote in message news:<cgnm8a$n35$>...
    >> In <> (ooze) writes:
    >>
    >> >your method is good only for writting code by yourself. you can not
    >> >tell whether the code written by others is right or wrong, so it is
    >> >good if I could have a copy of the C Standard which giving the rules
    >> >what is right, what is undefined, what's wrong.

    >>
    >> Anything wrong with K&R2?
    >>
    >> Dan

    >
    >I didn't say anything wrong about K&R. I was talking about how to
    >judge whether the code write by others is right or not, Sir.


    And what's wrong with using K&R2 for this purpose?

    Dan
    --
    Dan Pop
    DESY Zeuthen, RZ group
    Email:
    Dan Pop, Aug 30, 2004
    #17
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Thomas Matthews
    Replies:
    5
    Views:
    2,357
    tom_usenet
    Aug 2, 2004
  2. tweak

    keyword extern

    tweak, Jun 26, 2004, in forum: C Programming
    Replies:
    18
    Views:
    632
    Dan Pop
    Jun 29, 2004
  3. siliconwafer

    Use of 'extern' keyword

    siliconwafer, Jul 28, 2005, in forum: C Programming
    Replies:
    5
    Views:
    373
    Kenny McCormack
    Jul 31, 2005
  4. Seeker

    extern keyword

    Seeker, Jun 29, 2006, in forum: C Programming
    Replies:
    5
    Views:
    410
    Seeker
    Jul 3, 2006
  5. Andre
    Replies:
    5
    Views:
    512
    Keith Thompson
    Jul 17, 2012
Loading...

Share This Page