[immodule-qt] keyword static of C++ (Re: Question about svn trunk)

YamaKen yamaken at bp.iij4u.or.jp
Wed Aug 11 06:40:55 EEST 2004


Hi James, thanks for the indication.

Although I believed so, there ware no agreement with me.

Developers, I had done my best to proof that my understanding is
right from both implementation and specification. And another
well-experienced C++ programmer James has agreed with me now. So
I rewrite some codes in accordance with my understanding. Stop
me if you still think it wrong.

At Wed, 11 Aug 2004 09:25:34 +0800,
james.su at gmail.com wrote:
> 
> Hi,
> 
> static variable within a method are global for all class objects. It's
> same as what's in C.
> 
> So you must store per-object (instance) data into class member.
> 
> Regards
> James Su
> 
> On Wed, 11 Aug 2004 02:00:12 +0900, YamaKen <yamaken at bp.iij4u.or.jp> wrote:
> > Hi all, this is my last TODO item currently doable. Please reply
> > to any discussions to activate me :)
> > 
> > At Tue, 13 Jul 2004 02:46:53 +0900,
> > yamaken at bp.iij4u.or.jp wrote:
> > >
> > > At Mon, 12 Jul 2004 23:19:18 +0900,
> > > kaminmat at cc.rim.or.jp wrote:
> > > >
> > > > On Monday 12 July 2004 06:41, YamaKen wrote:
> > > > > Probably you have forgotten the
> > > > > code. QETWidget::translateKeyEventInternal() uses a static
> > > > > variable instead of instance variable to store the state as
> > > > > following, so lastWinId is required to prevent interwidget key
> > > > > state transition.
> > > >
> > > > I understood that the static variable in a method was separately
> > > > treated for each instance. lastWinId will be required if this understanding
> > > > is wrong. Please commit the code.
> > >
> > > At least, gcc 3.3.3 showed that my understanding is correct. See
> > > attached code and following result.
> > >
> > > $ gcc --version
> > > gcc (GCC) 3.3.3 [FreeBSD] 20031106
> > > $ ./a.out
> > > 0xbfbfe7cf: initial
> > > 0xbfbfe7ce: initial
> > > 0xbfbfe7cf: a
> > > 0xbfbfe7ce: a
> > >
> > > But I had recently seen some C++ codes based on your
> > > understanding. Is it a new C++ feature? Or, is some famous
> > > (wrong) explanation about it existing?
> > 
> > Daisuke and Cougar (and possibly Kazuki) are understanding
> > static variable within a method as per-instance storage. But I
> > can't imagine that such feature is a correct C++ specification
> > because it breaks linker semantics or costs unnatural constructs
> > through vptr.
> > 
> > I've investigated the C++ specification to verify this
> > issue. But I've not found any description about such feature.
> > 
> > First I've updated my C++ specification doc from 'ISO/IEC 14882
> > First edition 1998-09-01' to 'ISO/IEC 14882 Second edition
> > 2003-10-15' by purchasing from ANSI eStandards Store.
> > 
> > http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003
> > 
> > And I had read about the static. But I had found only
> > traditional definitions about it. No other definitions around
> > 'declared static' or 'keyword static' had been found by fulltext
> > search.
> > 
> > ----------------------------------------------------------------
> > 7 Declarations
> > 7.1.1 Storage class specifiers
> > 4 The static specifier can be applied only to names of objects
> >   and functions and to anonymous unions (9.5). There can be no
> >   static function declarations within a block, nor any static
> >   function parameters. A static specifier used in the
> >   declaration of an object declares the object to have static
> >   storage duration (3.7.1). A static specifier can be used in
> >   declarations of class members; 9.4 describes its effect. For
> >   the linkage of a name declared with a static specifier, see
> >   3.5.
> > 
> > 3.7 Storage duration
> > 3.7.1 Static storage duration
> > 1 All objects which neither have dynamic storage duration nor
> >   are local have static storage duration. The storage for these
> >   objects shall last for the duration of the program (3.6.2,
> >   3.6.3).
> > 
> > 2 If an object of static storage duration has initialization or
> >   a destructor with side effects, it shall not be eliminated
> >   even if it appears to be unused, except that a class object or
> >   its copy may be eliminated as specified in 12.8.
> > 
> > 3 The keyword static can be used to declare a local variable
> >   with static storage duration. [Note: 6.7 describes the
> >   initialization of local static variables; 3.6.3 describes the
> >   destruction of local static variables. ]
> > 
> > 4 The keyword static applied to a class data member in a class
> >   definition gives the data member static storage duration.
> > ----------------------------------------------------------------
> > 
> > In addition, I had googled about this issue and found a wiki
> > page.
> > 
> > Cpp Static Riddle
> > http://c2.com/cgi/wiki?CppStaticRiddle
> > 
> > ----------------------------------------------------------------
> > I've got a question on this topic. Is a static variable defined
> > in a class method, similar to a member variable that has scope
> > only for that method? In other words is a new static variable
> > created for each instance of the class?
> > 
> > No, see above for the meaning of static method variable and
> > static instance variable.
> > ----------------------------------------------------------------
> > 
> > These two descriptions in this mail and the behavior of gcc
> > 3.3.3 written in my previous mail are indicating that my
> > understanding is right.
> > 
> > I want to rewrite some codes in our repository involving static
> > variables if nobody shows me another information.
> > 
> > Anyone?

-------------------------------
YamaKen  yamaken at bp.iij4u.or.jp



More information about the immodule-qt mailing list