C/C++ macro expansion
C/C++ macro 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;
}
当我用调用宏时
UNIT_IMPLEMENT_UNIT_TYPE(DISTANCE, METER)
我得到编译错误:
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'
这意味着在括号内的最后一行中,宏没有按我希望的方式展开。我做错了什么?
#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)
删除宏名称和参数列表之间的空格。这些应该是:
#define UNIT_BASIC_UNIT_DEF2(name) ...
// ^^^
// no space here!
当有这样的空间时:
#define FOO (params) replacement
它定义了一个类似于宏的对象,其中符号直接被替换列表替换,而没有参数替换。这样的调用:
FOO(bar)
扩展为:
(params) replacement
通过删除空格,您可以得到一个函数,如宏所示:
#define FOO(params) replacement
并且CCD_ 1被正确地扩展为CCD_。
相关文章:
- LPWSTR typedef and macro?
- 如何修复MSVC++(Microsoft Visual studio)中"macro overloading"的可变参数宏相关问题?
- CALLBACK macro (QT)
- Specific C++ Macro
- QT Macro q_slots'''类访问限制之后
- 如何在Macro BranchCallback中固定界限/更改变量界限?C
- Qt with Visual Studio macro issue
- Replacing __LINE__ macro
- how to #define c++ STL macro
- CMake C/C++ macro generating
- 为什么海湾合作委员会声称我违反了"at least one argument for variadic macro",而我至少有一个论点?
- C++ - Xcode "Inline Function Expansion"像Visual Studio中的优化功能一样?
- c++ macro containing Q_OBJECT
- Mutex Protect Macro
- 动态变量上的c++MACRO未声明标识符
- Variadic Macro without __VA_ARGS__
- #ifdef macro
- Handling c++ wxWidgets EVT_MAXIMIZE macro
- 是“ Gnu-Zero-variadic-Macro-arguments”可靠地忽略
- C/C++ macro expansion