我应该在这个问题上使用内联或#define吗?

时间:2012-05-03 14:53:40

标签: c++ pthreads

我使用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 个答案:

答案 0 :(得分:3)

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

如果你的函数存在并且只在cpp中使用它应该在一个未命名的命名空间中......

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

如果它在标题中声明并且意味着要从许多其他cpps中使用它不应该是静态的或在未命名的命名空间中。

答案 1 :(得分: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,并将其放入像@Dave那样的namespace中。

答案 2 :(得分:2)

C ++的方式是以RAII方式获取锁,并在锁定失败时从构造函数中抛出异常。请参阅this example

答案 3 :(得分:1)

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

为什么?

对于函数,您可以对传递的函数参数进行类型检查,而不是宏 此外,对于宏,您会暴露出宏可能产生的愚蠢和奇怪的副作用。