我正在使用Visual Studio 2013并尝试编写预处理器宏,如果VERSION是有效的BCD编号,它将在编译时检查:
#define VERSION (uint8)0x01u
#if ((VERSION > 0x99u) || ((VERSION & 0x0Fu) > 0x09u))
#error "Invalid version"
#endif
但由于某种原因,VS2013显示以下消息:
error C1012: unmatched parenthesis : missing ')'
我已经检查了几次括号 - 但它看起来对我来说是正确的。有什么我想念的吗?
答案 0 :(得分:3)
预处理器不了解类型,因此无法正常工作。假设uint8
不是宏,则会扩展为
#if (((0)0x01u > 0x99u) || (((0)0x01u & 0x0Fu) > 0x09u))
因为宏替换后遗留的所有标识符都替换为零。这显然有语法错误。您收到的错误消息似乎对我有误导性,但您收到错误消息的事实是合适的。
您真的需要VERSION
才能拥有uint8
类型吗?如果没有,你可以简单地删除演员表。
如果确实需要将其作为uint8
类型,则需要以这样的方式编写表达式,即使它被0
替换,它仍然有效,例如((uint8)+0x01u)
}。
答案 1 :(得分:1)
您无法将宏定义为#define VERSION (uint8)0x01u
将其定义为'
#define VERSION 0x01u