簡體   English   中英

C將函數調用作為參數檢查宏定義時出錯,無法在MSVC上編譯

[英]C Error checking macro definition with function call as argument won't compile on MSVC

我正在嘗試使用Windows(MSVC,C11)上針對C99的一些代碼。 這是一些用於OpenCL調用的調試宏:

#define CL_CHECK(_expr)                                                         \
   do {                                                                         \
     cl_int _err = _expr;                                                       \
     if (_err == CL_SUCCESS)                                                    \
       break;                                                                   \
     fprintf(stderr, "OpenCL Error: '%s' returned %d!\n", #_expr, (int)_err);   \
     abort();                                                                   \
   } while (0)

#define CL_CHECK_ERR(_expr)                                                     \
   ({                                                                           \
     cl_int _err = CL_INVALID_VALUE;                                            \
     typeof(_expr) _ret = _expr;                                                \
     if (_err != CL_SUCCESS) {                                                  \
       fprintf(stderr, "OpenCL Error: '%s' returned %d!\n", #_expr, (int)_err); \
       abort();                                                                 \
     }                                                                          \
     _ret;                                                                      \
   })

當已知_expr的返回類型為cl_int類型時,使用第一個。 第二個可以是任何類型,這是我遇到編譯問題的地方。 我用“ auto”替換了typeof(_expr),但是編譯器一直抱怨:

  Error 8   IntelliSense: expected an expression    d:\work\Labs\dagSimCL\dagSimCL.cpp  136 23  dagSimCL
  Error 6   error C2143: syntax error : missing ';' before '{'  D:\work\Labs\dagSimCL\dagSimCL.cpp  136 1   dagSimCL
Error   7   error C2143: syntax error : missing ';' before ')'  D:\work\Labs\dagSimCL\dagSimCL.cpp  136 1   dagSimCL
Error   5   error C2059: syntax error : '{' D:\work\Labs\dagSimCL\dagSimCL.cpp  136 1   dagSimCL    

我在宏上拋出的內容並不重要,它始終是相同的。 但僅供參考,這是我正在做的:

cl_context context = CL_CHECK_ERR(clCreateContext(contextProperties, 1, &devices[device_id], NULL, NULL, &_err));

奇怪的是,當我嘗試將代碼包裝在do / while而不是第一個宏中的()中時,它開始抱怨“ do”。 我有點不知所措。 我可能會忘記它並跳過錯誤檢查,但是我想了解出了什么問題...

CL_CHECK_EXPR()宏對我來說似乎不正確:

  • _err的測試應始終失敗,因為CL_INVALID_VALUE應該不同於CL_SUCCESS

  • 我猜想_err應該派生自_expr ,但是在編寫時,它不起作用。

  • 對於缺少可移植性的typeof一個簡單解決方法是將實際類型作為宏參數傳遞。 與C ++中一樣,不支持使用auto關鍵字來推斷類型。

  • 此外,您的編譯器可能不支持表達式語句擴展,從而給您留下了很少的選擇。

您可能應該更改要包裝在此類宏中的內部API,以始終返回錯誤代碼,並使用指針參數返回正常結果。

CL_CHECK_EXPR()不是有效的C表達式,也不是用於賦值運算符右側的初始化列表:

cl_context context = CL_CHECK_EXPR(...);

C語言中的表達式不能包含復合語句(即{ } ), if語句或聲明語句之類的語句。

您確實需要將這些內容放入返回所需表達式的函數中,並讓CL_CHECK_EXPR()宏調用該函數。

暫無
暫無

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

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