2013-10-25 47 views
0

首先 - 對不起,我的英語不好:-( 二 - 。我有一些intresting任務 前言 PROGRAMM將在ATmega162的工作中,我們使用宏,becouse職能的工作非常緩慢甚至在線。 .. 任務 我有一個宏:使用微距++

#define ProvSetBit(reg, bit) (((reg) & (1<<(bit))) != 0) 

和校驗位轉在很長的,不可讀的字符串:

ProvSetBit(SystemStatus[0], COMMAND_ON_DF); 

#define COMMAND_ON_DF 0u

我想modificate它:

ProvSetBit(COMMAND_ON_DF); 

其中COMMAND_ON_DF:

#define COMMAND_ON_DF (SystemStatus[0], 0u) 

或東西在那裏。但它不起作用。調試器寫入:「錯誤[Pe054]:宏調用中參數太少」。你能指導我什麼?

+7

「becouse職能的工作非常緩慢。即使內聯「 - 錯誤。 –

+2

定義「它不工作」。怎麼了? – Ashalynd

+2

希望你正在學習宏的陷阱:他們是一隻要調試的豬。改用功能。他們不慢。 – Bathsheba

回答

3

如果一個函數實際上是內聯的,那麼不會是比執行同樣事情的宏慢 - 它們導致相同的程序集。和你發佈的代碼一樣微不足道的功能幾乎保證了內聯。你應該拋棄宏,而是調查爲什麼編譯器不爲你做內聯 - perhpas你沒有通過正確的編譯標誌?

如果雷爾,真的想/有宏堅持這一個,你可以使用Boost.Preprocessor來實現這一目標:

#include "boost/preprocessor/facilities/expand.hpp" 

#define ProvSetBit(args) BOOST_PP_EXPAND(ProvSetBit_1 args) 

#define ProvSetBit_1(reg, bit) (((reg) & (1<<(bit))) != 0) 

#define COMMAND_ON_DF (SystemStatus[0], 0u) 

int main() 
{ 
    ProvSetBit(COMMAND_ON_DF); 
} 

Live example