变量的宏总是用变量或常量定义吗?

时间:2011-04-27 14:04:41

标签: c++ macros

如果我在函数中有这样的宏:

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

,会发生什么

3 个答案:

答案 0 :(得分:3)

宏进行文本替换,基本上与在文本编辑器中进行搜索和替换相同。结果是C编译器解析并生成代码。

宏不关心arg1arg2是什么,它只是用字符串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)

在编译器看到代码之前,宏在单独的传递中作为文本替换进行处理。他们对功能和参数一无所知。