簡體   English   中英

簡化取消引用空指針

[英]Simplify dereferencing void pointer

此WINAPI線程回調:

DWORD WINAPI dont_thread_on_me(LPVOID context) {
    int value = *((int *)context);
    return ERROR_SUCCESS;
}

特別是這行:

    int value = *((int *)context);

作品。 但是*((int *)context)令人討厭。 有沒有更好的方法可以寫呢?

int value = *reinterpret_cast<int *>(context);

如果需要的話,您真的無法繞開事實。

您可以使用reinterpret_cast

int value = *reinterpret_cast<int *>(context);

編譯器必須知道如何處理context 因此,您必須通過強制類型轉換告訴編譯器它指向一個int 您可以使用以下宏將其隱藏

#define read_as_int(p) *(reinterpret_cast<int*>(p))

int value = read_as_int(context);

但這既不會提高可讀性,也不會增加鍵入代碼的工作量。 C ++純粹主義者可能更喜歡內聯函數:

int inline read_as_function(void*p) 
{ 
    return *(reinterpret_cast<int*>(p));
}

盡管該問題被標記為C ++,但它也作為C問題完全有效(而且我永遠也無法告訴人們是否正確地標記了問題),所以...

在C中,通常這樣寫:

foo( void *v ) {
  int *ip = v;
  int x = *ip;

這是優雅還是類型系統中的漏洞是個人喜好的問題。

暫無
暫無

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

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