宏__COUNTER__

-- TOC --

每当gcc编译器遇到__COUNTER__时,它都会被替换成一个int数字,这个数字从0开始,每次+1。

#include <stdio.h>

int main(){
    printf("%d\n", __COUNTER__);
    printf("%d\n", __COUNTER__);
    printf("%d\n", __COUNTER__);
    printf("%d\n", __COUNTER__);
    return 0;
}

输出:

0
1
2
3

这个技术,常常被用来生成一些为一的标识,clang也支持。

下面是linux内核中的定义:

/* same as gcc, this was present in clang-2.6 so we can assume it works
 * with any version that can compile the kernel
 */
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)

测试代码:

#include <stdio.h>

#define __CON(a,b)  a##b
#define _CON(a,b)   __CON(a,b)
#define PASTE(a)  _CON(_CON(a,_), __COUNTER__)

int main(){
    int PASTE(a) = 123;
    int PASTE(a) = 234;
    printf("%d\n",a_0);
    printf("%d\n",a_1);
    return 0;
}

本文链接:https://cs.pynote.net/sf/c/202303111/

-- EOF --

-- MORE --