gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:47:32 25 4
gpt4 key购买 nike

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

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

提前致谢,乔里。

最佳答案

当然,你也可以定义宏两次,定义不同:

#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 */ };

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

关于c - 如何在 C 预处理器宏中使用#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com