我应该在这个问题中使用内联还是 #define

Should I use inline or #define in this issue?

本文关键字:#define 问题 我应该      更新时间:2023-10-16

我使用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() 

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

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

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

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

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里。

C++的

方法是以 RAII 方式获取锁,并在锁定失败时从构造函数中抛出异常。 请参阅此示例。

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

为什么?

使用函数

,您可以对正在传递的函数参数进行类型检查,而使用宏则无法获得。
此外,使用宏,您将面临宏可能产生的愚蠢和奇怪的副作用。