2

我使用 pthreads,我想使用以下代码:

if(pthread_mutex_lock(&lock)){
        cout<<"error"<<endl;
        return ERROR;
    }

我的问题是我#define应该使用内联函数还是应该使用内联函数:

inline void func() {

if(pthread_mutex_lock(&lock)){
        cout<<"error"<<endl;
        return ERROR;
    }

}

函数应该是静态的吗?如:

static inline void func() 
4

4 回答 4

3

如果你能帮助它,你不应该对宏做任何事情(在这里,你可以帮助它)。

如果您的函数存在并且仅在 cpp 中使用,则它应该位于未命名的命名空间中...

namespace
{
    void func(){/*...*/}
}

如果它在标头中声明并打算从许多其他 cpp 中使用,则它不应该是静态的或在未命名的命名空间中。

于 2012-05-03T14:55:53.800 回答
2

C++ 方式是以RAII方式获取锁,如果锁定失败,则从构造函数中抛出异常。请参阅此示例

于 2012-05-03T15:48:27.900 回答
2

inline无关紧要。您确实意识到您必须使函数作为参数作为对任何类型的引用lock,然后允许返回类型。

所以做类似的事情:

ErrorType func(LockType &lock) 
{
     if(pthread_mutex_lock(&lock))
     { 
           prtSysErr(!DIRECT_EXIT,!FATAL); 
           return ERROR; 
     } 
     return NOERROR;
} 

然后这样称呼它:

if(func(lock)==ERROR)
{
     return ERROR;
}

我正在调用锁LockType的类型和错误的类型,ErrorType以便您将它们放在任何位置。我还假设NOERROR类似地调用没有错误的值。

是的,不要叫它func,把它放在namespace@Dave 说的那样。

于 2012-05-03T14:58:43.957 回答
1

不,您不应该使用宏。
您可以将其标记为内联或仅将其用作普通函数,如果编译器找到合适的候选者,它将内联它。
请注意,如果将函数标记为static只能在声明它的翻译单元中使用它。

为什么?

使用函数,您可以对传递的函数参数进行类型检查,而宏无法做到这一点。
此外,使用宏,您会接触到宏可能产生的愚蠢和奇怪的副作用。

于 2012-05-03T14:58:52.053 回答