我正在阅读linux内核,我发现了很多像这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
为什么他们使用这个而不是简单地在{}中定义它?
我想在C#而不是C++中进行以下操作
#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
Run Code Online (Sandbox Code Playgroud) 我想写这样的东西:
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法COV_ON
像这样定义?我知道我上面做的是错误的,因为我不能#ifdef
在#define里面.(#
不是允许的角色#define
).那么有什么解决方案吗?
我目前正在开发一个我打算移植的程序。我可以访问 Windows 和 macOS,并且我希望能够在两者上轻松调试。当错误处理时,我希望在那里有调试中断以使其变得容易(__debugbreak()
对于 MSVC)。由于我打算在多个平台上进行开发和测试,因此我想制作一个宏来执行以下操作:
#define DEBUG_BREAK #ifdef DEBUG\
#if _MSC_VER \
__debugbreak(); \
#elif __GNUC__ \
__builtin_trap(); \
#endif \
#endif
Run Code Online (Sandbox Code Playgroud)
DEBUG_BREAK
因此,在任何平台上调试时,我可以在任何想要破坏代码的地方编写代码。当我使用这个宏时,我收到错误'#' not expected here
。
我发现两个有些相关的问题:
但他们都没有回答我的问题,因为他们试图完成不同的事情。
所以我的问题是:如果允许的话,如何在宏内部使用预处理器 if 语句?如果不可能,我该怎么做才能获得这个损坏的DEBUG_BREAK
宏试图执行的相同功能?
注:DEBUG
编译时定义,用于调试;编译发布时未定义它。