在许多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) 我已经看了十多年了.我一直在努力思考它有什么好处.因为我主要在#defines中看到它,所以我认为它对内部范围变量声明和使用中断(而不是gotos)有好处.
对其他事情有好处吗?你用它吗?
可能的重复:
当我们定义一个宏时,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 \
}
可能重复:
#ifff在#define中
如何在宏内成功使用"#"字符?当我做那样的事情时,它会尖叫:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
Run Code Online (Sandbox Code Playgroud) 可能的重复:
当我们定义一个宏时,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) 我有一个我需要宏功能的功能.该函数包含临时变量,我不记得是否有关于在宏替换中使用临时变量的规则.
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)
这个可以吗?(即没有令人讨厌的副作用 - 除了通常的那些:不是"类型安全"等).顺便说一句,我知道"宏是邪恶的" - 在这种情况下我只需要使用它 - 没有多少选择.
虽然本论坛和所有其他论坛多次讨论过这个话题,但我仍有疑问.请帮忙.
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++中,是否可以使用嵌套的if语句创建一个多语句宏,如下所示?我已经尝试了一段时间了,我得到了第二个if语句无法看到' 符号 ' 的范围问题.也许我需要进一步了解宏.
#define MATCH_SYMBOL( symbol, token)
if(something == symbol){
if( symbol == '-'){
}else if (symbol != '-'){
}
other steps;
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么在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) #define FREE1(x) do { free(x); x = NULL; } while (0);
#define FREE2(x) { free(x); x = NULL; }
Run Code Online (Sandbox Code Playgroud)
这些宏有什么区别?