2

私はpthreadを使用しており、次のコードを使用したいと思います。

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(){/*...*/}
}

ヘッダーで宣言されており、他の多くのcppsから使用することを意図している場合は、静的または名前のない名前空間であってはなりません。

于 2012-05-03T14:55:53.800 に答える
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同様に呼び出されているエラーなしの値も想定しています。

ええ、それを呼ばないでください、そして@Daveが言っfuncたようにそれを入れてください。namespace

于 2012-05-03T14:58:43.957 に答える
2

C ++の方法は、RAIIの方法でロックを取得し、ロックが失敗した場合にコンストラクターから例外をスローすることです。この例を参照してください。

于 2012-05-03T15:48:27.900 に答える
1

いいえ、マクロは使用しないでください。
インラインとしてマークすることも、適切な候補が見つかった場合にコンパイラーがインライン化する通常の関数として使用することもできます。
関数をマークすると、static宣言したトランスレーションユニット内でのみ使用できることに注意してください。

なんで?

関数を使用すると、渡される関数の引数の型チェックを取得できますが、マクロでは取得できません。
また、マクロを使用すると、マクロが生成する可能性のある愚かで奇妙な副作用にさらされます。

于 2012-05-03T14:58:52.053 に答える