【C++】通过宏在类中添加属性
#define ADDATTRIBUTE(type, fieldName, attrName)\
protected:\
type fieldName##_;\
public:\
void Set##attrName(type fieldName){ fieldName##_ = fieldName; }\
type Get##attrName(){ return fieldName##_; }
1. 宏定义中的#
# 运算符将宏参数标识符转换为字符串字面量。
#include <iostream>
#define STRINGIFY(x) #x
#define STRINGIFY2(x) "Value: " #x
int main() {
int num = 100;
std::cout << STRINGIFY(hello) << std::endl; // 输出: hello
std::cout << STRINGIFY(num) << std::endl; // 输出: num (不是 100!)
std::cout << STRINGIFY(3.14) << std::endl; // 输出: 3.14
std::cout << STRINGIFY2(42) << std::endl; // 输出: Value: 42
return 0;
}
常用法:
- 调试输出
#define DEBUG_PRINT(var) std::cout << #var << " = " << var << std::endl
int x = 10;
DEBUG_PRINT(x); // 输出: x = 10
- 错误信息
#define CHECK_ERROR(code) \
if (code != 0) { \
std::cerr << "Error in " #code << std::endl; \
}
- 枚举转字符串
#define ENUM_CASE(name) case name: return #name;
const char* enumToString(MyEnum value) {
switch(value) {
ENUM_CASE(VALUE1)
ENUM_CASE(VALUE2)
default: return "UNKNOWN";
}
}
2. 宏定义中的##
## 是 连接运算符,它将两个标识符拼接成一个新的标识符。
#include <iostream>
#define CONCAT(a, b) a##b
#define MAKE_VAR(name, num) name##num
int main()
{
int var1 = 10, var2 = 20, var3 = 30;
// 示例1:直接连接
int xy = 100;
std::cout << CONCAT(x, y) << std::endl; // 输出: 100
// 示例2:创建变量名
int MAKE_VAR(value, 1) = 42; // 创建变量 value1
int MAKE_VAR(value, 2) = 84; // 创建变量 value2
std::cout << value1 << std::endl; // 输出: 42
std::cout << value2 << std::endl; // 输出: 84
// 示例3:连接多个部分
#define PREFIX_ var_
int PREFIX_ test = 123;
std::cout << var_test << std::endl; // 输出: 123
return 0;
}

浙公网安备 33010602011771号