我想定义一个宏,例如:
#define EX(X) (myArray # X + otherArray # X)
所以当我写:
v = EX([a+1][a+2]);
这将评估为:
v = myArray[a+1][a+2] + otherArray[a+1][a+2];
但这不起作用,并以某种方式增加了额外的括号。
答案 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