这个宏是不是一点作用都没有?

发布于 2022-10-15 08:21:15 字数 535 浏览 20 评论 0

宏的定义如下:

  1. #if !(defined (G_STMT_START) && defined (G_STMT_END))
  2. #  define G_STMT_START  do
  3. #  define G_STMT_END    while (0)
  4. #endif
  5. #define g_return_val_if_fail(expr,val)                G_STMT_START{ (void)0; }G_STMT_END

复制代码这个宏扩展开应该是这样的吧:

do
{
  (void)0;
}
while(0)
这样的话,这个宏岂不是什么意义都没有,不懂,请高手指教。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

一个人的旅程 2022-10-22 08:21:15

宏的参数都不用的?

甜嗑 2022-10-22 08:21:15

是啊 。

#if !(defined (G_STMT_START) && defined (G_STMT_END))

#  define G_STMT_START  do

#  define G_STMT_END    while (0)

#endif
在gmacros.h 里面定义

#define g_return_val_if_fail(expr,val)                G_STMT_START{ (void)0; }G_STMT_END
在gmessages.h里面定义

都是GTK+的源代码 ,不明白这样做是干什么。

兔小萌 2022-10-22 08:21:15

莫非是为了以后扩展?

全部不再 2022-10-22 08:21:15

前面那不有个判断么? 有的时候有处理, 有的时候没处理吧

赠佳期 2022-10-22 08:21:15

等达人解答。这个宏究竟有什么作用呢?无论展开与否都没有神马意义的样子……或许我Lvl不够

笨笨の傻瓜 2022-10-22 08:21:15

回复 1# qfmeal

    LZ你只给出了这个宏的定义。
    linux内核代码中也有这种do{...} while(0)宏定义,主要是防止 if 语句下误用导致的悬垂问题。
    看上去这个宏确实没有用,不过你动手搜一下哪里用到了这个宏,它怎么用的不就得了?......

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文