记一次使用经历
#include<iostream>
using namespace std;
struct A {
bool has_get_a() {
return true;
}
int get_a() {
return 1;
}
};
struct B {
bool has_get_b() {
return false;
}
int get_b() {
return -1;
}
};
#define PACK_GET_REQUIRED_VALUE(PACK, KEY, VALUE, LOG_ID) do { \
if (!(PACK->has_##KEY())) { \
return -1; \
} \
VALUE = PACK->KEY(); \
} while(0);
// # 用于将符号变成 字符串
// ## 负责符号连接
// VALUE = PACK->KEY(); 正确
// VALUE = PACK->##KEY(); 错误, 这个是直觉中的答案
// ## 用在讲两个符号进行连接变成一个,比如 a##b 这个最终是一个整体
// 但是 PACK->KEY -> 和 KEY 最终并不是一个整体, 所以不用加##
int main() {
int x;
A* aa;
B* bb;
PACK_GET_REQUIRED_VALUE(aa, get_a, x, 124);
cout << x << endl;
PACK_GET_REQUIRED_VALUE(bb, get_b, x, 123);
cout << x << endl;
}