如果我在函数中有这样的宏:
void SomeFunc(int arg1, int arg2)
{
float value1, value2;
float range;
//#define MatrixBlock MyMatrix.block<arg1,arg2>(value1, value2)
//#define BlockRange MatrixBlock.block<arg2, range>
#define MatrixBlock MyMatrix.block(value1, value2, arg1, arg2)
#define BlockRange MatrixBlock.block(value1, value2, 0, range)
/* My code using the above macros */
// Are the following lines necessary? What will happen if I don't undefine the macro?
#undef MatrixBlock
#undef BlockRange
}
每次都会获取新的arg1和arg2值,还是在第一次遇到宏时修复它们?我需要#undef
吗?如果我没有#undef
s
答案 0 :(得分:3)
宏进行文本替换,基本上与在文本编辑器中进行搜索和替换相同。结果是C编译器解析并生成代码。
宏不关心arg1
和arg2
是什么,它只是用字符串MatrixBlock
替换字符串MyMatrix.block<arg1,arg2>(value1, value2)
。然后如何解释结果取决于编译器。
答案 1 :(得分:2)
宏只是文本替换。
在您的代码中,您已定义了替换但从未对其进行操作。您将需要执行以下操作:
void SomeFunc(int arg1, int arg2) {
float value1, value2;
float range;
#define MatrixBlock MyMatrix.block<arg1,arg2>(value1, value2)
#define BlockRange MatrixBlock.block<arg2, range>
MatrixBlock; // as if you had written MyMatrix.block<arg1,arg2>(value1, value2); in the code
BlockRange myRange; // as if you had written MatrixBlock.block<arg2, range> myRange; in the code
/* My code using the above macros */
// Are the following lines necessary? What will happen if I don't undefine the macro?
#undef MatrixBlock
#undef BlockRange
}
所以,是的,每次调用函数时,你都会得到arg1,arg2,value1,value2,range的当前值。我注意到你正在尝试使用我认为不会起作用的运行时值来专门化模板。
如果您没有undef
宏,那么它们将可用于define
之后的所有代码,因此某些后续方法可以使用它们。如果这是在头文件中,则包含它的任何内容都可以访问这些宏。
在方法中定义但不是闻所未闻,这是不寻常的。
答案 2 :(得分:1)
在编译器看到代码之前,宏在单独的传递中作为文本替换进行处理。他们对功能和参数一无所知。