我正在尝试在宏中使用预处理程序指令?可以/怎么做到这一点?
#define HTTP_REQUEST_RETURN_ERROR(error) *errCode = error;
#ifdef DEBUG
LeaveCriticalSection(&debugOutputLock);
#endif
return NULL
提前致谢, JORI。
答案 0 :(得分:7)
当然,您也可以使用不同的定义两次定义宏:
#if defined DEBUG
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
LeaveCriticalSection(&debugOutputLock);\
return NULL;\
} while(0)
#else
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
return NULL;\
} while(0)
#endif
这确保避免xdazz使用的(通常可优化的)运行时if
。它还将宏体包裹在典型的do ... while
中,使其看起来像一个声明。
UPDATE :为了澄清,C语言中的多语句宏通常在do ... while(0)
循环中包装(在宏定义中),因为这会将整个文本转换为单个语句。这使得宏的使用可以很好地适用于范围和分号。
例如,考虑一下:
if(httpRequestFailed())
HTTP_REQUEST_RETURN_ERROR(404);
else
processResults();
如果没有do ... while(0)
,则上述语法错误,因为if
和else
之间会有多个语句。只是在宏扩展中添加大括号并不是很干净,因为如上所述的类似于语句的用法会导致扩展
if(httpRequestFailed())
{ ... /* code omitted */ };
这不是很干净,代码范围后面的大括号通常后面没有分号。
答案 1 :(得分:4)
您无法将预处理程序指令嵌套在#define
。
答案 2 :(得分:0)
定义DEBUG
,然后使用普通的if语句。
#define DEBUG 0
#define HTTP_REQUEST_RETURN_ERROR(error) *errCode = error;
if (DEBUG) LeaveCriticalSection(&debugOutputLock);
return NULL