【问题标题】:Preprocessor overload on C++ [duplicate]C ++上的预处理器重载[重复]
【发布时间】:2013-03-31 21:50:58
【问题描述】:

我目前正在完成一个库,并希望我的“调试”日志功能在编译时是可选的。

我的想法是:检查 DEBUG 是否已定义,然后定义我的自定义 debug 函数。

这是我所做的(部分)

#if defined(DEBUG)
    #define debug(s) Serial.println(s)
    #define debug(s,t) Serial.print(s);Serial.println(t)
#else
    #define debug(s) // s
    #define debug(s,t) // s t
#endif

(我正在为 Arduino 编译;这就是为什么我需要将函数一分为二。)

由于我使用了很多时间,Serial.printSerial.println 继任,我希望 debug(s) 也接受两个“参数”。

因此,插入debug("ParamOne");debug("ParamOne", "ParamTwo"); 将导致定义的函数。

但是,显然,只有最后定义的调试是有效的,覆盖第一个。

我应该怎么做,保持函数的名称相同,或者有什么更“正确”的方法吗?

【问题讨论】:

标签: c++ debugging compiler-construction arduino c-preprocessor


【解决方案1】:

#define 宏名称是唯一的,它们不是函数定义,因此您的第二个 #define 将覆盖第一个。你可能想做一些类似

的事情
#if defined(DEBUG)
    inline void debug(const char *s) { Serial.println(s); }
    inline void debug(const char *s, char *t) { Serial.print(s);Serial.println(t); }
#else
    inline void debug(const char *s) {  }
    inline void debug(const char *s, const char *t) { }
#endif

【讨论】:

  • This 说实际上可以进行宏重载。不过,编译器会优化空的内联函数。生成的指令可能是相同的。此外,内联函数增加了很多灵活性,所以我会说去吧! +1!
  • 不错!不知道“内联”函数......它也可以帮助我解决其他问题......只是有一个问题:debug(“char *”,int)需要一个单独的定义等等...... = /
  • 只需继续为每个添加单独的定义,它是内联的,它只在需要时编译到二进制文件中,并且在使用它的地方编译,而不是以类似的方式作为一个单独的函数宏的工作原理。
猜你喜欢
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多