【发布时间】:2015-07-07 21:53:25
【问题描述】:
我正在尝试构建一个只运行一次代码的宏。 例如,如果您循环代码并希望其中的某些内容只发生一次,则非常有用。简单易用的方法:
static int checksum;
for( ; ; )
{
if(checksum == 0) { checksum == 1; // ... }
}
但这有点浪费和混乱。所以我有这个宏使用检查位而不是检查变量的真/假状态:
#define CHECKSUM(d) static d checksum_boolean
#define CHECKSUM_IF(x) if( ~(checksum_boolean >> x) & 1) \
{ \
checksum_boolean |= 1 << x;
#define CHECKSUM_END }1
末尾的1是强制用户在末尾加上分号。在我的编译器中这是允许的。
问题是在不让用户指定x 的情况下弄清楚如何执行此操作(n 位要检查)。
所以他可以使用这个:
CHECKSUM(char); // 7 run-once codes can be used
for( ; ; )
{
CHECKSUM_IF
// code..
CHECKSUM_END;
}
想法我该如何实现?
【问题讨论】:
-
末尾的 1 是强制用户在末尾加上分号。在我的编译器中这是允许的。,看来你不知道
do { } while (0)这个把戏。 -
没有,但是 C89 的 clang 编译器.. 放置一个
1做同样的事情。 -
@Malina 不,它没有。例如,它将接受
CHECKSUM_END + 3;。这就是do ... while (0)技巧的最大优势:)和分号之间不能有任何内容。 (而且它适用于所有版本的 C,甚至 C89。) -
我不明白你的意思是它会接受
CHECKSUM_END +3;在常规环境中我使用这个技巧.. 但在当前的工作细节中.. 它只适用于1 -
看看
WARN_ONCE在Linux内核中的实现:lxr.free-electrons.com/source/include/asm-generic/bug.h#L119
标签: c if-statement macros conditional