如何在C预处理器宏中使用#?

时间:2012-08-24 09:31:37

标签: c c-preprocessor

我正在尝试在宏中使用预处理程序指令?可以/怎么做到这一点?

#define     HTTP_REQUEST_RETURN_ERROR(error)    *errCode = error;
                                                 #ifdef DEBUG
                                                        LeaveCriticalSection(&debugOutputLock);
                                                 #endif
                                                 return NULL

提前致谢, JORI。

3 个答案:

答案 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),则上述语法错误,因为ifelse之间会有多个语句。只是在宏扩展中添加大括号并不是很干净,因为如上所述的类似于语句的用法会导致扩展

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