C++ 使用宏更改旧代码的替代方法

C++ 使用宏更改旧代码的替代方法,c++,macros,raii,C++,Macros,Raii,我正在尝试用模式重新考虑一些旧代码。旧代码管理资源分配,但希望用户显式锁定/解锁资源。例如,类似这样的东西(只是一个示例,不是真正的代码): 将变成这样: void modify(int id){ RAIIOBJ obj; modify_data_related_to_id(id); } 这样做的好处是,您不必记住解锁对象。当删除raiobj时,将在其析构函数中自动调用unlock 问题是,有很多地方需要重新考虑。我想我会使用宏,用RAII调用替换lock调用,unlock将成

我正在尝试用模式重新考虑一些旧代码。旧代码管理资源分配,但希望用户显式锁定/解锁资源。例如,类似这样的东西(只是一个示例,不是真正的代码):

将变成这样:

void modify(int id){
    RAIIOBJ obj;
    modify_data_related_to_id(id);
}
这样做的好处是,您不必记住解锁对象。当删除
raiobj
时,将在其析构函数中自动调用unlock

问题是,有很多地方需要重新考虑。我想我会使用宏,用RAII调用替换
lock
调用,
unlock
将成为一个无操作功能,如:

#define lock() RAIIOBJ obj;
void unlock(){ //empty function
}

这样,我就不必更改使用RAII方法调用lock/unlock的每个位置。然而,有没有比使用宏更好的方法(可能有一种模式只是为了解决这类问题)呢。

你能修改
raiobj
?Clang提供了深入的、基于AST的、代码库范围的重构工具。仅仅因为你有很多这样的调用站点并不意味着你有很多工作要做。@ArunR如果上面的宏可以做到这一点,你就不能在整个代码库中搜索并替换这个字符串吗?手动展开这些宏:)我指的是使用find和sed。基于宏的解决方案可能会导致编译错误,这不是很糟糕,但也会导致死锁,更糟糕的是(例如
lock();if(x){unlock();lock();}unlock();
lock();unlock();f();
其中函数
f
也可以锁定)。我也看不到它的好处——人们仍然看到
锁定/解锁
,但现在它有了不同的语义。使用自动解决方案时要小心。@ArunR,递归锁也可能会死锁,因为您正在扩展被锁定的代码区域。在大多数情况下,您可以使用
类ScopeProtect{int scope\u protect\u member;}之类的方法来确保作用域的安全
#define lock(){ScopeProtect obj;{raiobj obj;
#define unlock()}(void)obj.scope_protect_member;}
。但我不会这么做,我要么保持原有的api不变(可能已弃用),要么手动进行更改。
#define lock() RAIIOBJ obj;
void unlock(){ //empty function
}