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)
但这不起作用,并以某种方式添加了额外的括号.
#是字符串化运算符.您想要的输出没有字符串,所以您不需要它.
您可能一直在使用##令牌粘贴操作符,但这对您的预期功能没有意义,因为该[字符不能构成有效预处理令牌的一部分.在任何情况下,您都不需要它,因为您只需使用空格分隔扩展/ 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)