對于在頭文件中定義(不能只聲明)static的函數 或者 static的類成員函數,需要注意的是,如果這個頭文件被不同的cpp包含,各自編譯出.o文件,那么*有可能*最后鏈接出來的可執行文件種,會存在該static函數的多個副本,有三種情況會導致這樣的事情發生,而如果你在這種函數里面放置了static變量,那就悲催了,因為這個static對象會被搞出多個來(不再如你所愿,全局唯一了):
1。頭文件中定義了static函數;
2。頭文件中定義了匿名namespace下的函數;
3。頭文件中定義了匿名namespace下的類成員函數;
所以,法門就是:不要在匿名的namespace下定義類,對于函數而言,用static聲明和放在匿名的namespace下是等同的。
對于在函數內部聲明的static變量,編譯器默認是會使得這樣的static變量在初始化時是線程安全的,控制它的選項是-fno-threadsafe-statics