c/c++语法笔记(一)

宏中#与##用法

  • # : 把宏参数变为一个字符串
  • ## : 把两个宏参数贴在一起
  • 嵌套宏结构 : 当被嵌套的宏中无#与##时,执行宏展开;否则,不展开被嵌套的宏
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>  
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)

int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}

结果输出: 12, f(1, 2)

__thread关键字

需求

进程中全局或者静态变量是所有线程可见的,需要有一种变量可以提供全局同名且线程内可修改互不干扰。

线程局部存储

用法:

1
static __thread int buf[MAX_ERROR_LEN];

注意点:

  1. 如果变量声明中使用了关键字static或extern,那么关键字__thread必须紧随其后。
  2. 与一般的全局或静态变量声明一样,线程局部变量在声明时可以设置一个初始值。
  3. 可以使用C语言取址操作符(&)来获取线程局部变量的地址。

c++额外局限性:

  1. 在C++中,如果要在定义一个thread-local变量的时候做初始化,初始化的值必须是一个常量表达式。
  2. __thread只能修饰POD类型,即不带自定义的构造、拷贝、赋值、析构的类型,不能有non-static的protected或private成员,没有基类和虚函数。但可以改为修饰class指针类型便无需考虑此限制。
0%