469,964 Members | 1,787 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,964 developers. It's quick & easy.

Initializing a static variable inside a namespace

ik
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

Jul 22 '05 #1
2 10547

"ik" <ik****@gmail.com> wrote in message
news:10**********************@k17g2000odb.googlegr oups.com...
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
Jul 22 '05 #2

"ik" <ik****@gmail.com> 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
Jul 22 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

6 posts views Thread by pembed2003 | last post: by
2 posts views Thread by Drew McCormack | last post: by
9 posts views Thread by Bryan Parkoff | last post: by
14 posts views Thread by Jess | last post: by
16 posts views Thread by RB | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.