Thanks for reply.But the problem it's not this point.... Let's see. hello.h:
> #include<QtCore> > class Hello : public QObject{ > Q_OBJECT > public: > Hello(QObject *parent = 0); > static int test(){ > static int i=0; > qDebug()<<i++; > return 0; > } > }; > hello.cpp > #include "hello.h" > > const int kkk=Hello::test(); > > Hello::Hello (QObject *parent) > { > } > test.py > from hello import Hello > Hello.test() > Here is the result: > $ python -v test.py > # installing zipimport hook > import zipimport # builtin > .... > ......stuff ouput..... > .... > import encodings.utf_8 # precompiled from > /usr/lib/python2.7/encodings/utf_8.pyc > Python 2.7.3 (default, Aug 1 2012, 05:14:39) > [GCC 4.6.3] on linux2 > Type "help", "copyright", "credits" or "license" for more information. > dlopen("/home/feng/fun/lab/pyqt/hello.so", 2); <----------Here > loal the hello.so > 0 <---------- const int kkk=Hello::test(); Now the i in > test() such be 1 > dlopen("/usr/lib/python2.7/dist-packages/sip.so", 2); > # /usr/lib/python2.7/atexit.pyc matches /usr/lib/python2.7/atexit.py > import atexit # precompiled from /usr/lib/python2.7/atexit.pyc > import sip # dynamically loaded from > /usr/lib/python2.7/dist-packages/sip.so > import PyQt4 # directory /usr/lib/python2.7/dist-packages/PyQt4 > # /usr/lib/python2.7/dist-packages/PyQt4/__init__.pyc matches > /usr/lib/python2.7/dist-packages/PyQt4/__init__.py > import PyQt4 # precompiled from > /usr/lib/python2.7/dist-packages/PyQt4/__init__.pyc > dlopen("/usr/lib/python2.7/dist-packages/PyQt4/QtCore.so", 2); > import PyQt4.QtCore # dynamically loaded from > /usr/lib/python2.7/dist-packages/PyQt4/QtCore.so > import hello # dynamically loaded from /home/feng/fun/lab/pyqt/hello.so > 0 <------------ the python *Hello.test()* ,the i in test() is still 0 > Let's print the *Hello::test()* > static int test(){ > static int i=0; > printf("%p\n",&Hello::test); > return 0; > } > run again: > $ python test.py > 0x7f8fc467bfe0 <----the *Hello::test() is *difference > 0x7f8fc488053f > When the pothon load the module dlopen("/home/feng/fun/lab/pyqt/hello.so", 2); > ...... > import hello # dynamically loaded from /home/feng/fun/lab/pyqt/hello.so > <----the *Hello::test() is *difference I think it's cause by twice load the Hello. Thank you On 24 October 2012 19:56, <mathias.b...@gmx.de> wrote: > On 24.10.2012, 00:11:13 D.Y Feng wrote: > > I meet a problem in my code: > > > hello.h: > > > #include<QtCore> > > > class Hello : public QObject{ > > Q_OBJECT > > public: > > Hello(QObject *parent = 0); > > static int test(){ > > static int i=0; > > qDebug()<<i++; > > return 0; > > } > > }; > > > hello.cpp: > > #include "hello.h" > > > const int i=Hello::test(); > > > Hello::Hello (QObject *parent) > > { > > } > > > hello.sip > > > %Module hello > > > %Import QtCore/QtCoremod.sip > > > > class Hello : public QObject { > > > %TypeHeaderCode > > #include "hello.h" > > %End > > > public: > > Hello(QObject *parent = 0); > > static int test(); > > }; > > > I use the const int i=Hello::test(); to invoke test() before main > > function.It's uesful in factory pattern when you want to auto register > driver. > > > the python test code > > import hello > > hello.Hello.test1() > > > It seems static int i in test() changed after import hello > > Now, I haven't tried that myself yet. On the other hand, I don't see any > problem. > > > Breakpoint 1, Hello::test1 () at hello.h:8 > > 8 static int test1(){ > > (gdb) p i > > $1 = 0 > > (gdb) p &i > > $2 = (const int *) 0x7ffff60300d0 > > This displays the address of your global variable "const int i". > > > (gdb) c > > Continuing. > > 0 > > > Breakpoint 1, Hello::test1 () at main.h:8 > > 8 static int test1(){ > > (gdb) p &i > > $3 = (const int *) 0x7ffff60300d0 > > Again, address of your global variable "const int i". > > > (gdb) n > > 10 qDebug()<<i++; > > (gdb) p &i > > $4 = (int *) 0x7ffff62355c0 <---What happen here? > > This shows the address of your local static variable "static int i", > which ought to be different. > The names of these objects, which are both "i", come into existence at > different times. While this is perfectly legal C++, it obviously > obfuscates your program. Just naming them differently should already > help a lot. > > In summary, I don't think this is an issue with PyQt. But let me quote > Bjarne Stroustrup: "C makes it easy to shoot yourself in the foot; C++ > makes it harder, but when you do it blows your whole leg off." > > Best Regards, > Mathias Born > > > -- DY.Feng(叶毅锋) yyfeng88625@twitter Department of Applied Mathematics Guangzhou University,China dyf...@stu.gzhu.edu.cn
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt