C/C++中宏定义的使用

  • 宏在预处理阶段被替换为其定义的文本;
  • 如果宏从未被使用,则不会生成任何代码或数据,对程序无影响;
  • 宏本身不是常量或变量,仅是文本模板——其展开结果是否可修改,取决于内容;
  • 在代码中写出宏名时,会被预处理器替换为对应的文本(可能是值、代码、类型等);
  • 若需在宏中动态拼接标识符(如 C_Person),必须使用 ## 操作符,例如 C_##name
  • 宏定义不受作用域影响,但是可以通过#define定义一个宏,也可以通过#undef取消定义;
  • 宏定义不作类型检查;
  • ###只能放在#define的后面:
    • #argument表示将argument转成字符串"argument"
    • argument1##argument2表示将表示将argument1argument2拼接成一个标识符。
#include <iostream>
#include <string>

#define DECLARE_SETTER(type, name) \
    void set_##name(const type &name) \
    { \
        m_##name = name; \
    }

#define DECLARE_GETTER(type, name) \
    type name() const \
    { \
        return m_##name; \
    }

#define DECLARE_VARIABLE(type, name) \
    type m_##name;

#define DECLARE_CLASS(className) \
class className \
{ \
public: \
    DECLARE_SETTER(std::string, name) \
    DECLARE_GETTER(std::string, name) \
\
    DECLARE_SETTER(int, age) \
    DECLARE_GETTER(int, age) \
\
private: \
    DECLARE_VARIABLE(std::string, name) \
    DECLARE_VARIABLE(int, age) \
};

#define TO_STRING(str) #str

int main()
{                                                                                                
    std::string str = TO_STRING(123);
    std::cout << str << std::endl;

    str = TO_STRING(Hello World);
    std::cout << str << std::endl;
    
    DECLARE_CLASS(Person)
    Person person;
    person.set_name("tom");
    person.set_age(23);
    
    std::cout << person.name() << " " << person.age() << std::endl;
    
    return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天遇见妞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值