相关疑难解决方法(0)

当我们定义宏时,do while(0)有什么用?

可能重复:
C/C++宏中的Do-while和if-else语句

我正在阅读linux内核,我发现了很多像这样的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

为什么他们使用这个而不是简单地在{}中定义它?

c macros linux-kernel

125
推荐指数
2
解决办法
5万
查看次数

C#中的#ifdef

我想在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)

c#

116
推荐指数
2
解决办法
13万
查看次数

#ifdef在#define中

我想写这样的东西:

#define COV_ON(x) \
                #ifdef COVERAGE_TOOL \
                    _Pragma (COVERAGE #x)
                #endif
Run Code Online (Sandbox Code Playgroud)

有没有办法COV_ON像这样定义?我知道我上面做的是错误的,因为我不能#ifdef在#define里面.(#不是允许的角色#define).那么有什么解决方案吗?

c c-preprocessor

69
推荐指数
5
解决办法
3万
查看次数

C++ - 如何在宏内使用预处理器 if 语句(#if、#elif、#endif)?

我目前正在开发一个我打算移植的程序。我可以访问 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

我发现两个有些相关的问题:

  1. 如何在 C 预处理器中的#define 中使用#if?
  2. C 预处理器 #if 表达式

但他们都没有回答我的问题,因为他们试图完成不同的事情。

所以我的问题是:如果允许的话,如何在宏内部使用预处理器 if 语句?如果不可能,我该怎么做才能获得这个损坏的DEBUG_BREAK宏试图执行的相同功能?

注:DEBUG编译时定义,用于调试;编译发布时未定义它。

c++ macros visual-c++ preprocessor-directive

0
推荐指数
1
解决办法
135
查看次数