一种在函数调用中定义新变量的方法

时间:2017-02-20 09:17:36

标签: c debugging c-preprocessor c89

我有一个函数dangerous(GEN x),我的代码中经常调用它,其中GENtypedef。出于调试目的,我想将checkSafe添加到此函数的所有实例中,例如

#ifdef DEBUG
  #define dangerous(x) GEN __x = (x); if(checkSafe(__x)) dangerous(__x)
#endif

但我担心这可能无法按预期运作。做这样的事情的正确方法是什么?该功能经常用于单独检测每个用途,因此不希望检查外部调试模式(出于各种原因)。

1 个答案:

答案 0 :(得分:3)

需要注意的事项/小心:

  1. 同时使用具有相同名称的宏和函数。虽然它可以产生有效的C,但你必须采取额外的预防措施以避免不必要的扩展(要么总是在宏之前定义函数,要么在定义时将括号中的函数名称括起来),并且必须 1) 2)仔细检查每次使用该功能还包括您的仪器代码。
  2. 解决方案:将原始功能重命名为_dangerous

    1. 在各种情况下使用宏:
      • if中,只有一条语句:if (foo) dangerous(x);
      • 来自父else的{​​{1}}:if
      • 将变量泄漏到父命名空间时可能会破坏:if (foo) dangerous(x); else bar();
    2. 解决方案:将宏包含在GEN __x = 5; dangerous(__x);等结构中。

      1. 您必须在复制时考虑任何副作用,例如资源分配或CPU密集型操作(因为do { ... } while(0)是typedef,这可能不是问题)。
      2. 最后,您可能还想在checkSafe失败时投诉,例如通过记录错误消息,甚至中止程序。

        将上述内容放在一起,您可以像这样检测功能:

        GEN
        1. 如果#ifdef DEBUG #define dangerous(x) do { \ GEN __x = (x); \ if (checkSafe(__x)) \ _dangerous(__x); \ else \ complainAbout(__x); \ } while(0) #else #define dangerous _dangerous #endif 返回您要使用的值(例如dangerous())。
        2. 解决方案:定义一个函数来检测原始函数并传递返回值:

          int