[英]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.