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