宏中#与##用法
- # : 把宏参数变为一个字符串
- ## : 把两个宏参数贴在一起
- 嵌套宏结构 : 当被嵌套的宏中无#与##时,执行宏展开;否则,不展开被嵌套的宏
1 |
|
结果输出: 12, f(1, 2)
__thread关键字
需求
进程中全局或者静态变量是所有线程可见的,需要有一种变量可以提供全局同名且线程内可修改互不干扰。
线程局部存储
用法:
1 | static __thread int buf[MAX_ERROR_LEN]; |
注意点:
- 如果变量声明中使用了关键字static或extern,那么关键字__thread必须紧随其后。
- 与一般的全局或静态变量声明一样,线程局部变量在声明时可以设置一个初始值。
- 可以使用C语言取址操作符(&)来获取线程局部变量的地址。
c++额外局限性:
- 在C++中,如果要在定义一个thread-local变量的时候做初始化,初始化的值必须是一个常量表达式。
- __thread只能修饰POD类型,即不带自定义的构造、拷贝、赋值、析构的类型,不能有non-static的protected或private成员,没有基类和虚函数。但可以改为修饰class指针类型便无需考虑此限制。