Initializing a static variable inside a namespace

Discussion in 'C++' started by ik, Sep 22, 2004.

  1. ik

    ik Guest

    Hello All,
    I am facing a problem as follows.

    I have a header file called myNameSpace.h which as the following
    contents.

    //Header file .. myNameSpace.h

    namespace myNameSpace {
    static int iMyInt = 0;
    };

    And my source file, as follows.

    // Source file myNameSpace.cpp

    #include "myNameSpace.h"

    myNameSpace::iMyInt = 0;

    int main(int argc, char* argv[])
    {
    return 0;
    }

    This gives me a compiler error.. on MingW.

    D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5: ISO C++
    forbids declaration of `iMyInt' with no type
    D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5:
    redefinition
    of `int myNameSpace::iMyInt'
    D:/users/others/cpp_trials/SimplePrograms/myNameSpace.h:5: `int
    myNameSpace::iMyInt' previously defined here

    at the same time ..

    #include "myNameSpace.h"

    int main(int argc, char* argv[])
    {
    myNameSpace::iMyInt = 0;
    return 0;
    }

    This compiles..

    I understand it is true for any variable declaration, at the global
    namespace. Once declared any other reinitalization, is taken as a
    re-definition.
    I would like to know what is the correct explanation to this ?
    Any help will be appreciated.
    Thanks in Advance
    ~Ik
    ik, Sep 22, 2004
    #1
    1. Advertising

  2. "ik" <> wrote in message
    news:...
    > Hello All,
    > I am facing a problem as follows.
    >
    > I have a header file called myNameSpace.h which as the following
    > contents.
    >
    > //Header file .. myNameSpace.h
    >
    > namespace myNameSpace {
    > static int iMyInt = 0;


    This is dubious. If you include this header in more than one source file you
    will get multiple variables. If you change the value of the variable in one
    file you will not see the change in another file. Is that what you want? It
    seems unlikely.

    > };
    >
    > And my source file, as follows.
    >
    > // Source file myNameSpace.cpp
    >
    > #include "myNameSpace.h"
    >
    > myNameSpace::iMyInt = 0;


    This is wrong, you have missed out the type (int).

    >
    > int main(int argc, char* argv[])
    > {
    > return 0;
    > }
    >
    > This gives me a compiler error.. on MingW.
    >
    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5: ISO C++
    > forbids declaration of `iMyInt' with no type
    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5:
    > redefinition
    > of `int myNameSpace::iMyInt'
    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.h:5: `int
    > myNameSpace::iMyInt' previously defined here
    >
    > at the same time ..
    >
    > #include "myNameSpace.h"
    >
    > int main(int argc, char* argv[])
    > {
    > myNameSpace::iMyInt = 0;
    > return 0;
    > }
    >
    > This compiles..


    Because it is an assignment not a declaration.

    >
    > I understand it is true for any variable declaration, at the global
    > namespace. Once declared any other reinitalization, is taken as a
    > re-definition.


    I wouldn't know about that. I try to declare and initialise my variables
    once only.

    > I would like to know what is the correct explanation to this ?
    > Any help will be appreciated.
    > Thanks in Advance
    > ~Ik


    Here's what you should be doing (probably)

    //Header file .. myNameSpace.h

    namespace myNameSpace {
    extern int iMyInt;
    }

    // Source file myNameSpace.cpp

    #include "myNameSpace.h"

    namespace myNameSpace {
    int iMyInt = 0;
    }

    It's really just the same as global variables outside of a namespace.

    john
    John Harrison, Sep 22, 2004
    #2
    1. Advertising

  3. ik

    Sharad Kala Guest

    "ik" <> wrote in message
    > Hello All,
    > I am facing a problem as follows.
    >
    > I have a header file called myNameSpace.h which as the following
    > contents.
    >
    > //Header file .. myNameSpace.h
    >
    > namespace myNameSpace {
    > static int iMyInt = 0;


    > };


    There should be no trailing semicolon after a namespace definition.

    > And my source file, as follows.
    >
    > // Source file myNameSpace.cpp
    >
    > #include "myNameSpace.h"
    >
    > myNameSpace::iMyInt = 0;


    int myNameSpace::iMyInt = 0; // Redefinition

    If your intent was to give it a value then it should have been in a function
    block. You can't have such floating expressions without a function body.

    > int main(int argc, char* argv[])
    > {
    > return 0;
    > }
    >
    > This gives me a compiler error.. on MingW.
    >
    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5: ISO C++
    > forbids declaration of `iMyInt' with no type


    This is because you missed on the "int".

    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.cpp:5:
    > redefinition
    > of `int myNameSpace::iMyInt'


    This is becuase you are redefining myNameSpace::iMyInt.

    > D:/users/others/cpp_trials/SimplePrograms/myNameSpace.h:5: `int
    > myNameSpace::iMyInt' previously defined here
    >
    > at the same time ..
    >
    > #include "myNameSpace.h"
    >
    > int main(int argc, char* argv[])
    > {
    > myNameSpace::iMyInt = 0;


    Inside a function this is just an expression assigning 0 to
    myNameSpace::iMyInt.

    > return 0;
    > }
    >


    Sharad
    Sharad Kala, Sep 22, 2004
    #3
    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. Adam Smith
    Replies:
    0
    Views:
    477
    Adam Smith
    Apr 15, 2004
  2. Avi Uziel
    Replies:
    14
    Views:
    797
  3. Steven T. Hatton
    Replies:
    1
    Views:
    6,623
    Siemel Naran
    Apr 19, 2004
  4. SM
    Replies:
    8
    Views:
    147
    -Lost
    May 1, 2007
  5. Stanimir Stamenkov

    Initializing a global namespace object

    Stanimir Stamenkov, Jul 26, 2010, in forum: Javascript
    Replies:
    39
    Views:
    357
    David Mark
    Jul 30, 2010
Loading...

Share This Page