在宏定义中使用括号

时间:2016-03-01 18:38:11

标签: c macros c-preprocessor

我想定义一个宏,例如:

  #define EX(X)   (myArray # X + otherArray # X)

所以当我写:

   v = EX([a+1][a+2]);

这将评估为:

   v = myArray[a+1][a+2] + otherArray[a+1][a+2];

但这不起作用,并以某种方式增加了额外的括号。

1 个答案:

答案 0 :(得分:5)

#是字符串化运算符。您想要的输出没有字符串,因此您不需要它。

您可能一直在使用##令牌粘贴运算符,但这对您的预期功能没有意义,因为Choose字符不能构成有效预处理令牌的一部分。在任何情况下,您都不需要它,因为您只需使用空格分隔(见下文)展开[ / X标识符旁边的myArray参数。

function-like macro定义中,参数列表后面的空格后面的所有内容都是类函数宏的“主体”,因此成为扩展的一部分。这意味着您在正文中包含的任何括号都将成为扩展的一部分(除非它们构成类似函数的宏调用的一部分,在您的情况下它们不是这样)。如果您不想在扩展中使用它们,请不要将它们包含在体内。

您可以通过以下方式获得所需的输出:

otherArray

这扩展到

#define EX(X) myArray X + otherArray X

如果你真的关心数组标识符和下标之间的空间(没有理由你应该这样做),你可以通过以下技巧摆脱它们:

v = myArray [a+1][a+2] + otherArray [a+1][a+2];

以上扩展为

#define EXPAND(...) __VA_ARGS__
#define EX(X) EXPAND(myArray)X + EXPAND(otherArray)X