簡體   English   中英

使用宏強制轉換pthread的start_routine參數

[英]Casting pthread's start_routine argument with a macro

我正在嘗試了解我收到的一些代碼。 它的工作方式與pthread_create相似:向它傳遞一個指向函數start_routine的指針,該函數將指向void arg的指針作為單個參數,並傳遞參數指針本身,然后pthread_create調用您的函數。

通常,如果start_routine實際上需要一個參數,則不需要void * ,而應將arg轉換為指向某個結構的指針。 過去,我已經將start_routine編寫為:

void *my_start_routine(void *arg)
{
    struct my_struct *p = arg;
    // use p many times
}

但是,我剛剛收到的代碼中,作者每次使用p都會設置一個宏來進行強制轉換:

void *my_start_routine(void *arg)
{
#define p ((struct my_struct *) arg)
    // use p many times

#undef p
}

我很難理解為什么要這么做。 但是我認為它是有意的,因為它看起來比第一種方法更困難且不那么明顯,並且作者在整個代碼中都使用了類似的習慣用法。 是否出於某種原因(無論出於性能還是其他原因)更喜歡此處的宏?

你的習慣是可取的。 在我看來,其他人使用該宏是可憎的,原因如下:

  • p不是左值
  • 改變arg會影響p並非顯而易見。
  • 調試器不會知道p是什么。
  • ...

我可能看到的唯一可能的區別是,不會在堆棧上為p分配空間,但這是一個相當可疑的優化,因為它在函數開始時只執行了一次,並且很可能會被編譯器優化任何方式。

如今,我傾向於僅將預處理器用於非常簡單的替換,因為宏可以更好地完成,因為內聯函數(或編譯器進行自己的優化)和分組常量(例如錯誤代碼)更好地作為枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM