我使用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()
答案 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
,则只能在声明它的翻译单元中使用它。
为什么?
对于函数,您可以对传递的函数参数进行类型检查,而不是宏 此外,对于宏,您会暴露出宏可能产生的愚蠢和奇怪的副作用。