根据C++11的最终委员会草案N3092,在16.3节“宏替换”中,对象式宏的定义为:
# define <标识符> <替换列表> <新行> 而函数式宏的定义为:
# define <标识符> ( <标识符列表_opt> ) <替换列表> <新行> # define <标识符> ( ... ) <替换列表> <新行> # define <标识符> ( <标识符列表> , ... ) <替换列表> <新行> 所有宏都具有替换列表(所谓的宏值),其定义如下: <替换列表>: 其中,pp-token定义如下: : 预处理记号 <预处理记号> 例如,预处理记号可以是标识符。
就我所了解的情况,带有空值的宏是被定义的。 然而,16.3-3指出:
在对象式宏的定义中,标识符和替换列表之间应该有空格。
请注意,替换列表本身不是可选的(尽管它可以具有空值)。
因此,我认为:
# define <标识符> <替换列表> <新行> 而函数式宏的定义为:
# define <标识符> ( <标识符列表_opt> ) <替换列表> <新行> # define <标识符> ( ... ) <替换列表> <新行> # define <标识符> ( <标识符列表> , ... ) <替换列表> <新行> 所有宏都具有替换列表(所谓的宏值),其定义如下: <替换列表>: 其中,pp-token定义如下: : 预处理记号 <预处理记号> 例如,预处理记号可以是标识符。
就我所了解的情况,带有空值的宏是被定义的。 然而,16.3-3指出:
在对象式宏的定义中,标识符和替换列表之间应该有空格。
请注意,替换列表本身不是可选的(尽管它可以具有空值)。
因此,我认为:
//well-formed (function-like macro with value)
#define f(x) (x)<NEWLINE>
//well-formed (function-like macro without value)
#define f(x)<NEWLINE>
//well-formed (function-like macro without value)
#define f(x) <NEWLINE>
//well-formed (object-like macro with value)
#define f hello<NEWLINE>
//**ill-formed** (object-like macro without value)
#define f<NEWLINE>
//well-formed (object-like macro without value)
#define f <NEWLINE>
因此,例如,所谓的“包含保护”应该采用以下形式:
#ifndef is_xyz_included<NEWLINE>
#define is_xyz_included <NEWLINE> // NOTE THE SPACE BEFORE <NEWLINE>
#endif<NEWLINE>
我的解释有误吗?
#define FOO
应该是有效的),那么对于实现者或用户来说,它并不直接重要。但值得指出和修复。 - Keith Thompson