RT,
#define FUNC(a) #a
#define FUNCS(a,b) a##b
第一个#a的作用是将宏参数a变成字符串,如下面例子中,将对应的版本号转换为字符串
#define VERSION_MAJOR 1
#define VERSION_MINOR 29
#define VERSION_PATCH 2
#define STRINGIFY(v) STRINGIFY_HELPER(v)
#define STRINGIFY_HELPER(v) #v //See Here
#define VERSION_STRING STRINGIFY(UV_VERSION_MAJOR) "." \
STRINGIFY(UV_VERSION_MINOR) "." \
STRINGIFY(UV_VERSION_PATCH)
const char* version_string(void) {
return VERSION_STRING;
}
需要注意其中有两次宏转化过程, 第一次STRINGIFY(v) 将数字展开,第二次将数字直接转变为字符串;而不能直接这样使用:
#define STRINGIFY(v) #v
STRINGIFY(VERSION_MAJOR)
因为但凡宏定义里有用'#'或'##'的地方宏参数是不会再展开的,即上面的输出是字符串“VERSION_MAJOR”
补充@2020.0606 : Linux driver 中有一个宏定义 __stringify实现了相同的功能;
第二个a##b的作用是将ab连成字符串
typedef struct {
char *task_name;
char *process_name;
int (*main)(void);
int is_helper;
int show_output;
int timeout;
} task_entry_t, bench_entry_t;
#define TEST_DECLARE(name) \
int run_test_##name(void); // See Here
#define TEST_ENTRY(name) \
{ #name, #name, &run_test_##name, 0, 0, 5000 },