对于在头文件中定义(不能只声明)static的函数 或者 static的类成员函数,需要注意的是,如果这个头文件被不同的cpp包含,各自编译出.o文件,那么*有可能*最后链接出来的可执行文件种,会存在该static函数的多个副本,有三种情况会导致这样的事情发生,而如果你在这种函数里面放置了static变量,那就悲催了,因为这个static对象会被搞出多个来(不再如你所愿,全局唯一了):
1。头文件中定义了static函数;
2。头文件中定义了匿名namespace下的函数;
3。头文件中定义了匿名namespace下的类成员函数;
所以,法门就是:不要在匿名的namespace下定义类,对于函数而言,用static声明和放在匿名的namespace下是等同的。
对于在函数内部声明的static变量,编译器默认是会使得这样的static变量在初始化时是线程安全的,控制它的选项是-fno-threadsafe-statics