相关疑难解决方法(0)

为什么在宏中使用明显无意义的do-while和if-else语句?

在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)

我看不出它do while在做什么.为什么不在没有它的情况下写这个?

#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud)

c c++ c++-faq c-preprocessor

758
推荐指数
8
解决办法
9万
查看次数

做{...}而(0) - 有什么好处?

可能重复:
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?

我已经看了十多年了.我一直在努力思考它有什么好处.因为我主要在#defines中看到它,所以我认为它对内部范围变量声明和使用中断(而不是gotos)有好处.

对其他事情有好处吗?你用它吗?

c loops

315
推荐指数
4
解决办法
14万
查看次数

C多行宏:do/while(0)vs scope block

可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
做{...}而(0)有什么好处?

我已经看到一些包含在do/while(0)循环中的多行C宏,如:

#define FOO \
  do { \
    do_stuff_here \
    do_more_stuff \
  } while (0)

与使用基本块相反,以这种方式编写代码有什么好处(如果有的话):

#define FOO \
  { \
    do_stuff_here \
    do_more_stuff \
  }

c macros multiline

173
推荐指数
1
解决办法
10万
查看次数

宏中的"#ifdef"

可能重复:
#ifff在#define中

如何在宏内成功使用"#"字符?当我做那样的事情时,它会尖叫:

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor

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

"{{}} while(0)"在内核代码中的作用是什么?

可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
C多行宏:do/while(0)vs scope block

我已经看到了很多这样的用法,以前我是程序员想要轻松打破一段代码.为什么我们需要在这里执行while {...} while(0)循环?我们试图告诉编译器一些东西吗?

例如,在Linux内核2.6.25中,包含/ asm-ia64/system.h

/*
 * - clearing psr.i is implicitly serialized (visible by next insn)
 * - setting psr.i requires data serialization
 * - we need a stop-bit before reading PSR because we sometimes
 *   write a floating-point register right before reading the PSR
 *   and that writes to PSR.mfl
 */
#define __local_irq_save(x)         \
do {                    \
    ia64_stop();                \
    (x) = ia64_getreg(_IA64_REG_PSR);   \
    ia64_stop();                \
    ia64_rsm(IA64_PSR_I);           \
} while (0)
Run Code Online (Sandbox Code Playgroud)

c kernel linux-kernel

20
推荐指数
4
解决办法
6026
查看次数

C宏可以包含临时变量吗?

我有一个我需要宏功能的功能.该函数包含临时变量,我不记得是否有关于在宏替换中使用临时变量的规则.

long fooAlloc(struct foo *f, long size)
{
   long      i1, i2;
   double   *data[7];

   /* do something */
   return 42;
}
Run Code Online (Sandbox Code Playgroud)

MACRO表格:

#define ALLOC_FOO(f, size) \
{\
   long      i1, i2;\
   double   *data[7];\
\
   /* do something */ \
}
Run Code Online (Sandbox Code Playgroud)

这个可以吗?(即没有令人讨厌的副作用 - 除了通常的那些:不是"类型安全"等).顺便说一句,我知道"宏是邪恶的" - 在这种情况下我只需要使用它 - 没有多少选择.

c c-preprocessor

11
推荐指数
4
解决办法
2万
查看次数

怎么做{} while(0)在宏中工作?

虽然本论坛和所有其他论坛多次讨论过这个话题,但我仍有疑问.请帮忙.

do{} while(0)in-macro 如何在Linux内核中工作?例如,

#define preempt_disable()    do { } while (0)
Run Code Online (Sandbox Code Playgroud)

它如何禁用抢占?

#define might_resched()    do { } while (0)
Run Code Online (Sandbox Code Playgroud)

它是如何重新安排的?

类似地,我已经看到了互斥锁和其他宏的宏.这有什么用?我理解以下问题,但不是上面的例子.

#define foo(x)    do { do something } while(0)
Run Code Online (Sandbox Code Playgroud)

编辑:

以下代码怎么样rt_mutex_lock

/**
 * rt_mutex_lock - lock a rt_mutex
 *
 * @lock: the rt_mutex to be locked
 */
void __sched rt_mutex_lock(struct rt_mutex *lock)
{
        might_sleep();
        rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, 0, rt_mutex_slowlock);
}
EXPORT_SYMBOL_GPL(rt_mutex_lock);


/*
 * debug aware fast / slowpath lock,trylock,unlock
 *
 * The atomic acquire/release ops are compiled away, …
Run Code Online (Sandbox Code Playgroud)

c do-while

7
推荐指数
2
解决办法
2020
查看次数

C++中的多语句宏

在C++中,是否可以使用嵌套的if语句创建一个多语句宏,如下所示?我已经尝试了一段时间了,我得到了第二个if语句无法看到' 符号 ' 的范围问题.也许我需要进一步了解宏.

#define MATCH_SYMBOL( symbol, token)
     if(something == symbol){
          if( symbol == '-'){
          }else if (symbol != '-'){
          }
     other steps;
     }
Run Code Online (Sandbox Code Playgroud)

c++ macros

4
推荐指数
2
解决办法
9979
查看次数

do {} while(0)有什么用?

可能重复:
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
当我们定义宏时,do while(0)有什么用?
怎么做{} while(0)在宏中工作?

我想知道它的用途do{ ... } while(0)(...作为其他代码的占位符),就我所知,它与使用时完全相同....

您可以在官方CPython源代码中找到这样的代码.作为一个例子,Py_DECREF宏:

#define Py_DECREF(op)                                   \
    do {                                                \
        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
        --((PyObject*)(op))->ob_refcnt != 0)            \
            _Py_CHECK_REFCNT(op)                        \
        else                                            \
        _Py_Dealloc((PyObject *)(op));                  \
    } while (0)
Run Code Online (Sandbox Code Playgroud)

c c++ python do-while semantics

3
推荐指数
1
解决办法
302
查看次数

"do {free(x); x = NULL;} while(0);"之间的区别是什么?和"{free(x); x = NULL;}"

#define FREE1(x) do { free(x); x = NULL; } while (0);
#define FREE2(x) { free(x); x = NULL; }
Run Code Online (Sandbox Code Playgroud)

这些宏有什么区别?

c

3
推荐指数
2
解决办法
589
查看次数