• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 297
  • Last Modified:

static variables

This question might have to do with some knowledge of AIX4.2.x based C++ compiler(xlC_r). I am new to this environment. here it goes:

i've a C++ class file with a certain static variable(say "astat". this goes into a shared library and this library is linked into an executable.
now when I run this executable(the file that intializes/defines this static var is part of only the shared library), i find 2 addresses for the static varible "astat" when accessed from 2 different functions.  why would  this happen ??

if you are familiar with AIX's makeC++SharedLib_r/xlC_r to create shared libs and executables respectively, is there a link line option to supress these multiple copies ?
0
rajaram
Asked:
rajaram
  • 5
  • 4
1 Solution
 
mlevCommented:
The definition/initialization isn't in a header file, right?
0
 
rajaramAuthor Commented:
here it goes:

file:  hdr.h
       -----

class A {
  private:
    static sp var1;      // sp - a struct definition.
  public:
    ..
    ..
    stativ void initVars();
    static void someOperation();
    ..
    ..
};
________________________________________________________________

file  impl.cpp
      --------

sp A::var1;

void A::initVars() {
   // initialize the static varible
};

void A::someOperation() {
   // this function is accessed by various routines to
   // use/manipulate the stativ var
};

.
.
____________________________________________________________


0
 
xyuCommented:
Did You tell to the compiler & linker that class A is expoted/imported any way ???
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
xyuCommented:
I see additional problem in Your code ... You have to specify initializer to You static variable... nobody garanted order of initialization of statics
0
 
rajaramAuthor Commented:
1st comment :
i have not used any options which will tell the compiler/linker to export/import these files. frankly i dont know if I have to
do it or how to export/import files ?

2nd comment:

please see the .cpp file. the first line (sp A::var1;) should
do. atleast this works on SOLARIS/HPUX/WIN-NT.
do i've to equate it to NULL or something ??
0
 
xyuCommented:
2 nd comment... its good practice to specify initializer (constructor) for static variable (by stabdard it have to be zerroed, but i'v seen alredy 2 cases where it wasn't 0) :)

look at documentation on Your compiler for keywords export/import, _export/_import ... it may help You... I don't have compiler here so i can't check it ... but export/import is standard keyword... so check it.. and shoe me the results if any... i'll help You then  
0
 
rajaramAuthor Commented:
i'll hunting for the compiler/linker documentation. once i get
them i'll try and let you know.
thanks.
0
 
xyuCommented:
the suggestion is the next try to do like that

in hdr.h

#ifndef HDR_DECLSPEC
  #define HDR_DECLSPEC _export
#endif

class HDR_DECLSPEC A {
  private:
    static sp var1;      // sp - a struct definition.
  public:
    ..
    ..
    stativ void initVars();
    static void someOperation();
    ..
    ..
};

and before using in in the main (non-shared part of the program)
do
#define HDR_DECLSPEC _import

it may help
0
 
rajaramAuthor Commented:
WHEN does one require to export/import files ?
btw, this is an encouraging suggestion. thanks!

Coming from a SOLARIS background, i've never understood the
logic/reason behind export/import of files(if possible please
answer the "WHEN" part).

great suggestion!!
0
 
xyuCommented:
I make it as answer... so i could get some points :)

ok..

when You specifying _export You are not exporting the file You just instruct compiler to generate class code that way that it can berecognized by linker as exportable for generation of export tables of shared module... the same way when You specifying _import You instruct the compiler not to jenerate any implementation of class methods and VFT and class statics but prepere information for linket to import it ...

so in the shared module source it should look like that
class _export Foo {...}

and in main module (that using the shared one):
class _import Foo {...}

so example i gave to You before shows one of the ideas to provide this difference...

try it on Your compiler (it may work)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now