预处理器宏:缺少括号

时间:2014-08-06 10:44:00

标签: c macros c-preprocessor

我正在使用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 ')'

我已经检查了几次括号 - 但它看起来对我来说是正确的。有什么我想念的吗?

2 个答案:

答案 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
相关问题