C 在宏定义中使用括号

C 在宏定义中使用括号,c,macros,c-preprocessor,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]; 但这不起作用,而且不知何故还添加了额外的括号。是字符串化操作符。您想要的输出没有字符串,所以您不需要它 您可能一直在使用令牌粘贴操作符,但这对您的预期功能没有意义,因为[字符不能构成有效预处理令

我想定义一个宏,例如:

  #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参数,请参见下文

在定义中,参数列表后面的空格后面的所有内容都是类似于宏的函数体,因此成为展开的一部分。这意味着,包含在函数体中的任何括号都将是展开的一部分,除非它们构成类似于宏调用的函数的一部分,而在您的情况下它们不会。如果您不需要它们在展开中,不要将它们包含在正文中

您可以通过以下方式实现所需的输出:

#define EX(X) myArray X + otherArray X
这扩展到

v = myArray [a+1][a+2] + otherArray [a+1][a+2];
v = myArray[a+1][a+2] + otherArray[a+1][a+2];
如果您真的关心数组标识符和下标之间的空间,那么没有理由这样做,您可以使用以下技巧消除它们:

#define EXPAND(...) __VA_ARGS__
#define EX(X) EXPAND(myArray)X + EXPAND(otherArray)X
以上内容扩展到

v = myArray [a+1][a+2] + otherArray [a+1][a+2];
v = myArray[a+1][a+2] + otherArray[a+1][a+2];
是字符串化运算符。所需的输出没有字符串,因此不需要它

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

在定义中,参数列表后面的空格后面的所有内容都是类似于宏的函数体,因此成为展开的一部分。这意味着,包含在函数体中的任何括号都将是展开的一部分,除非它们构成类似于宏调用的函数的一部分,而在您的情况下它们不会。如果您不需要它们在展开中,不要将它们包含在正文中

您可以通过以下方式实现所需的输出:

#define EX(X) myArray X + otherArray X
这扩展到

v = myArray [a+1][a+2] + otherArray [a+1][a+2];
v = myArray[a+1][a+2] + otherArray[a+1][a+2];
如果您真的关心数组标识符和下标之间的空间,那么没有理由这样做,您可以使用以下技巧消除它们:

#define EXPAND(...) __VA_ARGS__
#define EX(X) EXPAND(myArray)X + EXPAND(otherArray)X
以上内容扩展到

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

什么额外的圆括号?它会产生很多错误,并以某种方式执行类似于:myArray[a+1][a+2]的操作什么额外的圆括号?它会产生很多错误,并以某种方式执行类似于:myArray[a+1][a+2]的操作