【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;
}
posted @ 2026-01-20 00:04  仰望星河Leon  阅读(0)  评论(0)    收藏  举报