在宏定义中使用方括号

Using brackets in a macro definition

我想定义一个宏,例如:

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

所以当我写的时候:

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

这将计算为:

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

但这行不通,不知何故还添加了额外的括号。

# 是字符串化运算符。你想要的输出没有字符串,所以你不需要它。

您可能一直在寻找 ## 标记粘贴运算符,但这对您的预期功能没有意义,因为 [ 字符不能构成有效预处理标记的一部分。在任何情况下,您都不需要它,因为您可以简单地扩展与 myArray/otherArray 标识符相邻的 X 参数,并用白色 space 分隔(见下文) .

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

您可以通过以下方式实现您想要的输出:

#define EX(X) myArray X + otherArray X

扩展为

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

如果你真的关心数组标识符和下标之间的 space(没有理由你应该),你可以用下面的技巧去掉它们:

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

以上展开为

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