tags:

views:

407

answers:

7

Can someone explain when you're supposed to use the static keyword before global variables or constants defined in header files?

For example, lets say I have a header file with the line:

const float kGameSpriteWidth = 12.0f;

Should this have static in front of const or not? What are some best practices for using static? Thanks!

+6  A: 

static renders variable local to the file which is generally a good thing, see for example this Wikipedia entry.

Dirk Eddelbuettel
I don't think this has to do with "files", instead it has to do with "compilation modules".
AraK
I think the correct term is translation unit.
GMan
@GMan yes you are correct :)
AraK
+1  A: 

static before a global variable means that this variable is not accessible from outside the compilation module where it is defined.

E.g. imagine that you want to access a variable in another module:

foo.c

int var; // a global variable that can be accessed from another module
// static int var; means that var is local to the module only.
...

bar.c

extern int var; // use the variable in foo.c
...

Now if you declare var to be static you can't access it from anywhere but the module where foo.c is compiled into.

Note, that a module is the current source file, plus all included files. i.e. you have to compile those files separately, then link them together.

AraK
+3  A: 

Rule of thumb for header files:

  • declare the variable as extern int foo; and put a corresponding intialization in a single source file to get a modifiable value shared across translation units
  • use static const int foo = 42; to get a constant which can be inlined
Christoph
A: 

Yes, use static

Always use static in .c files unless you need to reference the object from a different .c module.

Never use static in .h files, because you will create a different object every time it is included.

DigitalRoss
A: 

The correct mechanism for C++ in anonymous namespaces. If you want something that is local to your file, you should use an anonymous namespace rather than the static modifier.

read: http://cplusplus.co.il/2009/09/24/everything-about-namespaces/

rmn
A: 

global static variables are initialized at compile-time unlike automatic

Captain Comic
+2  A: 

You should not define global variables in header files. You should define them in .c source file.

  • If global variable is to be visible within only one .c file, you should declare it static.

  • If global variable is to be used across multiple .c files, you should not declare it static. Instead you should declare it extern in header file included by all .c files that need it.

Example:

  • example.h

    extern int global_foo;
    
  • foo.c

    #include "example.h"
    
    
    int global_foo = 0;
    static int local_foo = 0;
    
    
    int foo_function()
    {
       /* sees: global_foo and local_foo
          cannot see: local_bar  */
       return 0;
    }
    
  • bar.c

    #include "example.h"
    
    
    static int local_bar = 0;
    static int local_foo = 0;
    
    
    int bar_function()
    {
        /* sees: global_foo, local_bar */
        /* sees also local_foo, but it's not the same local_foo as in foo.c
           it's another variable which happen to have the same name.
           this function cannot access local_foo defined in foo.c
        */
        return 0;
    }
    
Tomek Szpakowicz
I think you've missed the point. This is a const float, there's nothing wrong with defining it static const in a header file, and having a different copy of it in each translation unit. But most people would just use a #define to a literal.
Steve Jessop
Question was: "Can someone explain when you're supposed to use the static keyword before global variables or constants defined in header files?" Since OP seems to be beginner, I simply gave the most basic rule about defining global variables in C. As you have noticed yourself--you usually cannot do yourself harm using global _const_s in header file (in C, it's not so simple in C++).
Tomek Szpakowicz