【问题标题】:Is there a macro that expands to return without parentheses?是否有一个宏可以扩展为不带括号返回?
【发布时间】:2012-08-05 14:03:59
【问题描述】:

我想使用这样的宏

#define  Return(x)   {call_my_function(); return (x);}

有什么方法可以使用或声明不带括号的宏,所以我可以像真正的返回调用而不是函数一样使用它?例如:

BOOL my_func() {
    code....
    Return FALSE;
}

【问题讨论】:

  • #define Return call_myfunction(); return 怎么样?
  • @KerrekSB 啊,你打败了我 :)
  • @KerrekSB - 这不适用于if (someCondition()) Return FALSE;
  • 恕我直言 - 避免使用宏和 #define,除了简单的东西。我想这就是 C++ 试图从语言中尽可能多地删除它们的原因。无论如何,请记住它是一个简单的替换(没有类型检查,没有范围,nowt)。只需简单的搜索和替换。

标签: c c-preprocessor parentheses


【解决方案1】:

你可以做一些可怕的事情

#define  Return for (call_my_function(); ;) return

编辑:更改为 Daniel 的版本,以制作漂亮的笑脸。 Jim 直接“重载”return 的想法是有效的,甚至更可怕;)

【讨论】:

  • +1 对于有效的解决方案。这是对通常的 #define foo do { stuff; } while(0) 的一个很好的重复,以避免范围问题。
  • 我会说非常可怕,与其他只是可怕的答案相比......
  • +1 或者#define Return for (call_my_function();;) return,不需要逗号。
  • 我实际上可以想到很多次——包括我现在正在考虑的事情——当我本可以使用#define return while(somedebugging(), 1) return ...注意这是不是 一个递归宏!
【解决方案2】:

你可以做一些诡计(尽管强烈建议不要这样做):

#define Return call_my_function(); return

然后像这样使用它:

Return false;

这将扩展为

call_my_function; return false;

编辑:将这个问题上的两个 cmets 作为示例来理解我为什么不鼓励这种用法。

【讨论】:

  • 这是假设call_my_function 本身不是#define 否则大括号可能会起作用。
  • @EdHeal 为什么你认为我强烈反对使用它? :)
  • @mouviciel 同样适用于您的评论。
  • 这就像买了一些剪刀然后抱怨他们无法切割 0.25" 钢......
  • Jens Gustedt 的回答没有范围问题。
【解决方案3】:

考虑

#define  Return(x)   {call_my_function(); return (x);} 
if (1) Return (0);

将展开为

if (1) {call_my_function(); return (1);}

有些人建议你可以使用 summat 之类的

#define Return call_my_function(); return

现在

if (1) Return;

将扩展为

if (1) call_my_function();
return;

意图略有不同。

【讨论】:

    【解决方案4】:

    从定义中删除 { 和 }。

    在宏中,确切的字符用于替换(除了 x 也被替换)。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 2019-01-25
      • 2015-12-19
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多