Solved

static variables

Posted on 1998-08-17
10
256 Views
Last Modified: 2011-09-20
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
Comment
Question by:rajaram
  • 5
  • 4
10 Comments
 
LVL 2

Expert Comment

by:mlev
ID: 1170569
The definition/initialization isn't in a header file, right?
0
 

Author Comment

by:rajaram
ID: 1170570
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
 
LVL 3

Expert Comment

by:xyu
ID: 1170571
Did You tell to the compiler & linker that class A is expoted/imported any way ???
0
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
LVL 3

Expert Comment

by:xyu
ID: 1170572
I see additional problem in Your code ... You have to specify initializer to You static variable... nobody garanted order of initialization of statics
0
 

Author Comment

by:rajaram
ID: 1170573
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
 
LVL 3

Expert Comment

by:xyu
ID: 1170574
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
 

Author Comment

by:rajaram
ID: 1170575
i'll hunting for the compiler/linker documentation. once i get
them i'll try and let you know.
thanks.
0
 
LVL 3

Expert Comment

by:xyu
ID: 1170576
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
 

Author Comment

by:rajaram
ID: 1170577
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
 
LVL 3

Accepted Solution

by:
xyu earned 120 total points
ID: 1170578
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

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question