Solved

static variables

Posted on 1998-08-17
10
250 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
 
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Within a class, declare a function/method as static or not 16 132
PDF library for Delphi 2 104
IdTCPClient1->Disconnect(); not working 3 60
I could not build boost code, 10 78
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 pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

911 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

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now