2

我正在尝试在宏中使用预处理器指令?这可以/如何实现?

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

在此先感谢,乔里。

4

3 回答 3

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

if这可以确保避免xdazz使用的(可优化的)运行时。它还将宏体包装在典型的do ... while中,使其看起来像一个语句。

更新:为了澄清,C 中的多语句宏通常被包装在一个do ... while(0)循环中(在宏定义中),因为这会使整个文本变成一个语句。这使得宏的使用可以很好地与范围和分号一起使用。

例如,考虑一下:

if(httpRequestFailed())
  HTTP_REQUEST_RETURN_ERROR(404);
else
  processResults();

如果没有,上述将是一个语法错误,因为在和do ... while(0)之间会有多个语句。只是在宏扩展中添加大括号不是很干净,因为像上面这样理想的类似语句的用法会导致扩展ifelse

if(httpRequestFailed())
  { ... /* code omitted */ };

这不是很干净,代码范围后面的大括号通常不跟分号。

于 2012-08-24T09:48:50.080 回答
4

您不能将预处理器指令嵌套在#define.

于 2012-08-24T09:32:59.670 回答
0

定义DEBUG然后使用正常的 if 语句。

#define DEBUG 0

#define HTTP_REQUEST_RETURN_ERROR(error)  *errCode = error;
                                          if (DEBUG) LeaveCriticalSection(&debugOutputLock);
                                          return NULL
于 2012-08-24T09:36:19.047 回答