在宏定义中使用括号

sra*_*mij 0 c macros c-preprocessor

我想定义一个宏,例如:

  #define EX(X)   (myArray # X + otherArray # X)
Run Code Online (Sandbox Code Playgroud)

所以当我写:

   v = EX([a+1][a+2]);
Run Code Online (Sandbox Code Playgroud)

这将评估为:

   v = myArray[a+1][a+2] + otherArray[a+1][a+2];
Run Code Online (Sandbox Code Playgroud)

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

bgo*_*dst 5

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

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

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

您可以使用以下方法获得所需的输出:

#define EX(X) myArray X + otherArray X
Run Code Online (Sandbox Code Playgroud)

这扩展到

v = myArray [a+1][a+2] + otherArray [a+1][a+2];
Run Code Online (Sandbox Code Playgroud)

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

#define EXPAND(...) __VA_ARGS__
#define EX(X) EXPAND(myArray)X + EXPAND(otherArray)X
Run Code Online (Sandbox Code Playgroud)

以上扩展到

v = myArray[a+1][a+2] + otherArray[a+1][a+2];
Run Code Online (Sandbox Code Playgroud)