消除继承的超长MACRO

时间:2010-05-26 06:29:32

标签: c++ c gcc

我从一些C算法代码继承了很长的一组宏。当函数异常或正常退出时,它基本上在多个结构上调用free。我想用更可调试和可读的东西替换它们。一个片段如下所示

#define FREE_ALL_VECS {FREE_VEC_COND(kernel);FREE_VEC_COND(cirradCS); FREE_VEC_COND(pixAccum).....
#define FREE_ALL_2D_MATS  {FREE_2D_MAT_COND(circenCS); FREE_2D_MAT_COND(cirradCS_2); } 
#define FREE_ALL_IMAGES {immFreeImg(&imgC); immFreeImg(&smal.....
#define COND_FREE_ALLOC_VARS {FREE_ALL_VECS FREE_ALL_2D_MATS FREE_ALL_IMAGES}

什么方法最好?如果它有效,我应该独自离开吗?该宏集在一个函数中被调用十二次。我在Linux上使用gcc。

4 个答案:

答案 0 :(得分:2)

通常我会将这些宏重构为函数,当代码真正性能至关重要时,使用内联函数。此外,我尝试将分配,释放和清理内容移动到C ++对象中,以利用自动销毁。

答案 1 :(得分:1)

理想情况下,我会使用内联函数而不是使用宏来消除函数调用开销。但是,根据您的代码片段,您拥有的宏将调用多个嵌套函数。内联它们可能没有任何影响,因此我建议将它们重构为函数以使它们更具可读性和可维护性。仅当内联函数很简单时(例如访问器,变换器,无循环),内联才能提高性能。

答案 2 :(得分:1)

我相信这是你的决定。如果宏在调试时出现问题,我认为最好创建一些与宏相同的函数。通常,您应该避免使用复杂的宏。复杂的我指的是宏而不仅仅是一个简单的值定义。

推荐:

// it is best to use only this type of macro
#define MAX_VALUE 200

不推荐其余部分(参见下面的示例):

// this is not recommended

#define min(x,y) ( (x)<(y) ? (x) : (y) )

// imagine using min with some function arguments like this:
//
// val = min(func1(), func2())
//
// this means that one of functions is called twice which is generally
// not very good for performance

答案 3 :(得分:1)

如果它们坏了,那么通过转换为函数来修复它们。

如果他们没有被打破,那就离开吧。

如果您决定更改它们,请编写单元测试以检查您是否不会无意中破坏某些内容。