在许多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) 可能的重复:
当我们定义一个宏时,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宏中验证类型,到目前为止,我提出的最佳方法是:
#define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE))
Run Code Online (Sandbox Code Playgroud)
这显然需要一个类型名称和指向该类型的指针.也可以制作类似的ASSERT_TYPE宏.这对GCC来说似乎很有效.它甚至在类型不匹配的情况下提供了非常有用的错误消息.问题是我不能完全确定这是有效的C还是最好的方法.
据我所知,标准说您可以转换函数指针,但调用转换函数指针的结果是未定义的.在这种情况下,不可能在运行时调用该函数.这是否足够好或标准意味着你甚至不能编写无法调用的代码来调用强制转换函数?