在宏定义中使用方括号
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];
我想定义一个宏,例如:
#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];