如何覆盖arduino库头中的#define

时间:2017-02-10 03:41:02

标签: c++ class arduino header override

我在项目中使用RunningMedian Arduino库。

在库头文件中,MEDIAN_MAX_SIZE预设为19。

     #define MEDIAN_MAX_SIZE     19  // adjust if needed

我需要覆盖标题以生成MEDIAN_MAX_SIZE 30而不更改库文件,因此将来仍可以进行更新。

我的声明:

     #define RunningMedian::MEDIAN_MAX_SIZE 30     // library over ride ??
     #define ACTIVE_MAX 30 // max active buffer size
     RunningMedian ActiveSamples( ACTIVE_MAX ); // FIFO readings

     This will not compile.

库代码不会创建大于MEDIAN_MAX_SIZE的缓冲区。

如何在不更改RunningMedian.h文件的情况下覆盖19 for 30并仍在其类中更改MEDIAN_MAX_SIZE大小?

3 个答案:

答案 0 :(得分:1)

您可以#undef MEDIAN_MAX_SIZE并重新定义它,如下所示:

#ifdef MEDIAN_MAX_SIZE //if the macro MEDIAN_MAX_SIZE is defined 
#undef MEDIAN_MAX_SIZE //un-define it
#define MEDIAN_MAX_SIZE 30//redefine it with the new value
#endif 

您可能希望在使用调整后的值完成后将其重新定义为原始值,以防其他内容依赖于原始值。

答案 1 :(得分:1)

Alex Zywicki's answer适用于重新定义宏无关紧要的情况。但是,为了安全起见或者如果您需要确保将宏定义回其先前的定义,您可以使用the push_macro and pop_macro pragmas(假设您的编译器支持它):

#ifdef MEDIAN_MAX_SIZE
#pragma push_macro("MEDIAN_MAX_SIZE")
#define MEDIAN_MAX_SIZE 30

// Use the modified value for MEDIAN_MAX_SIZE here

#pragma pop_macro("MEDIAN_MAX_SIZE")

这允许您临时重新定义代码块的宏。

答案 2 :(得分:0)

我认为应该可以在项目中创建仅包含更改后的定义的新头文件(例如MyRunningMedian.h):

#ifndef MEDIAN_MAX_SIZE
#define MEDIAN_MAX_SIZE     30
#endif

然后,您需要将此头文件传递给预处理器,以将其作为RunningMedian的第一个#include包括在内。您可以使用-include指令来执行此操作,请参见https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

例如在PlatformIO中,您可以通过以下方式在platformio.ini中进行操作:

[common]
build_flags = 
    -include "include/MyRunningMedian.h"