2017-02-10 128 views
1

我在項目中使用RunningMedian Arduino庫。如何覆蓋arduino庫頭中的#define

在庫的頭文件中的MEDIAN_MAX_SIZE被預設爲19

 #define MEDIAN_MAX_SIZE  19 // adjust if needed 

我需要重寫頭,使MEDIAN_MAX_SIZE 30在不改變庫文件,以便更新仍然可以在將來實現。

我declatations:

 #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,並且仍然在其類中更改MEDIAN_MAX_SIZE大小?

+0

在* RunningMedian.h *中更改它,如果* RunningMedian.cpp *被單獨編譯到一個目標文件中,那麼如果將它放在其他位置,它將不會看到您的重定義。 –

回答

0

您可以#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

@ user1213320也許值得一提的是,這段代碼需要在第一次定義之後出現,否則在重新定義之前,舊值*可能被用在其他地方。 *例如。 RunningMedian.cpp可能在包含重定義的頭文件被包含之前單獨編譯,因此它將使用舊值* –

0

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") 

這可以讓你暫時重新定義宏塊的代碼。