3

I want to make an array static and also want to reference it in the other translation unit. Then I define it as static int array[100] = {...}, and declare it in other translation unit as extern int array[]. But the compiler tells me that the storage class of static and extern conflict with each other, how could I pass it and still reach my goal?

Thomson
  • 20,586
  • 28
  • 90
  • 134
  • At what point did you decide that you needed to "make the array static"? – Kerrek SB Nov 10 '11 at 02:10
  • 1
    @KerrekSB I think most people think that a global `static` variable would mean the same thing as making a class variable `static` or making a local variable in a function `static`. It's an understandable mistake, but it doesn't even do nearly that. – Seth Carnegie Nov 10 '11 at 02:13
  • see http://stackoverflow.com/questions/4615192/why-does-the-static-keyword-have-so-many-meanings-in-c-and-c – c-urchin Nov 10 '11 at 15:31

3 Answers3

14

Remove the static. Just have the int array[100] = {...}; in one .cpp file, and have extern int array[100]; in the header file.

static in this context means that other translation units can't see it. That obviously conflicts with the extern directive.

Seth Carnegie
  • 73,875
  • 22
  • 181
  • 249
2

static in file scope is pretty much a declare-private directive to the assembler. It is most certainly different than static in class or function scope.

E.g. in zlib, #define LOCAL static is used.

moshbear
  • 3,282
  • 1
  • 19
  • 33
2

Instead of making the variable global, consider leaving it static and adding public accessors and modifiers to it. It's not a great thing to directly couple to naked variables in other modules.

Craig Mc
  • 179
  • 1
  • 2