G. *_* Ko 3 c c++ macros expansion
我有以下代码:
#define UNIT_BASIC_UNIT_DEF2 (name) UNIT_BASIC_ ## name
#define UNIT_UNIT_TYPE_DEF2 (basic_type, name) UNIT_ ## basic_type ## _ ## name
#define UNIT_BASIC_UNIT_CLASS_NAME2(name) CUnit ## name
#define UNIT_UNIT_TYPE_CLASS_NAME2(basic_type, name) CUnit ## basic_type ## _ ## name
#define UNIT_BASIC_UNIT_DEF (name) UNIT_BASIC_UNIT_DEF2(name)
#define UNIT_UNIT_TYPE_DEF (basic_type, name) UNIT_UNIT_TYPE_DEF2 (basic_type, name)
#define UNIT_BASIC_UNIT_CLASS_NAME(name) UNIT_BASIC_UNIT_CLASS_NAME2(name)
#define UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) UNIT_UNIT_TYPE_CLASS_NAME2(basic_type, name)
#define UNIT_IMPLEMENT_UNIT_TYPE(basic_type, name) \
CUnitAbstract& UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name)::dup(){\
UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) * n = new UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name)(this->value);\
return *n;\
}\
CUnitAbstract& UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) ::operator+(CUnitAbstract& value){\
DYNAMIC_ASSERT(dynamic_cast< UNIT_BASIC_UNIT_CLASS_NAME(basic_type) *>(&value) != NULL);\
CUnitAbstract * tmp = &this->dup();\
*tmp = this->value + conversionTable[UNIT_BASIC_UNIT_DEF(basic_type)][UNIT_UNIT_TYPE_DEF(basic_type, name)] * value.getInBasicUnit();return *tmp;\
}
Run Code Online (Sandbox Code Playgroud)
当我用宏调用宏时
UNIT_IMPLEMENT_UNIT_TYPE(DISTANCE, METER)
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
error: 'basic_type' was not declared in this scope
error: 'name' was not declared in this scope
error: expected ']' before 'UNIT_basic_type_name'
error: expected ';' before 'UNIT_basic_type_name'
Run Code Online (Sandbox Code Playgroud)
这意味着宏没有扩展,因为我希望它在括号内的最后一行.我做错了什么?
#define UNIT_BASIC_UNIT_DEF2 (name) UNIT_BASIC_ ## name
#define UNIT_UNIT_TYPE_DEF2 (basic_type, name) UNIT_ ## basic_type ## _ ## name
...
#define UNIT_BASIC_UNIT_DEF (name) UNIT_BASIC_UNIT_DEF2(name)
#define UNIT_UNIT_TYPE_DEF (basic_type, name) UNIT_UNIT_TYPE_DEF2 (basic_type, name)
Run Code Online (Sandbox Code Playgroud)
删除宏名称和参数列表之间的空格.这应该是:
#define UNIT_BASIC_UNIT_DEF2(name) ...
// ^^^
// no space here!
Run Code Online (Sandbox Code Playgroud)
当有这样的空间时:
#define FOO (params) replacement
Run Code Online (Sandbox Code Playgroud)
它定义了一个类似于对象的宏,其中符号直接被替换列表替换,没有参数替换.所以这样的调用:
FOO(bar)
Run Code Online (Sandbox Code Playgroud)
扩展到这个:
(params) replacement
Run Code Online (Sandbox Code Playgroud)
通过删除空格,您可以按预期获得类似函数的宏:
#define FOO(params) replacement
Run Code Online (Sandbox Code Playgroud)
并FOO(bar)正确扩展到replacement.