2012-05-03 39 views
2

我與並行線程工作,我想利用這個代碼:我應該在這個問題中使用內聯還是#define?

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

你從'#define'中獲得了什麼好處? – Pubby

+0

較短的代碼... – 0x90

+0

什麼?由10個字符組成。如果你寫得安全,那麼宏將會更長。 – Pubby

回答

3

你不應該做任何事情的宏如果你能幫助它(在這裏,你能幫助它)。

如果你的函數生活,並以CPP應該在具名命名空間僅用於...

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

如果它在一個標頭的聲明,並打算從許多其他CPPS使用不應該是靜態的還是未命名的名稱空間。

+0

+1只是爲了'如果你能幫助它,你不應該對宏做任何事情'。 –

+0

我完全不明白命名空間與這個問題有什麼關係。 –

+0

@MichaelBurr他問他是否應該使用'static',它在全局命名空間中指定了內部鏈接 - 但是靜態使用已被替換爲使用未命名的命名空間。 – David

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像@達夫說。

+0

我們希望'lock'不是全局的! – Pubby

+0

這是'func'問題的調用者。 :) –

1

不,你不應該使用宏。
您可以將它標記爲內聯,或者只是將它用作普通函數,如果編譯器找到合適的候選項,就會將其內聯。
請注意,如果您將該函數標記爲static,則只能在聲明它的翻譯單元中使用它。

爲什麼?

有了函數,你可以通過函數參數的類型檢查來傳遞函數參數。
另外,使用宏時,您會暴露宏觀可能產生的愚蠢和奇怪的副作用。

2

C++的方法是以RAII的方式取鎖,並在鎖定失敗時從構造函數中拋出異常。見this example

+0

+1完全同意。 –

相關問題