2012-03-01 60 views
3

我感興趣的是能夠做這樣的事:C++編譯時的狀態變量

void ISR() 
{ 
    MEASURE_TIME(counters) 
    do_something(); 
    MEASURE_TIME(counters) 
    do_something_else(); 
    MEASURE_TIME(counters) 
    do_another_thing(); 
    MEASURE_TIME(counters) 
    do_one_last_thing(); 
    MEASURE_TIME(counters) 
} 

這將在編譯時不知怎麼翻譯成這樣:

void ISR() 
{ 
    counters[0] = measure_time(); 
    do_something(); 
    counters[1] = measure_time(); 
    do_something_else(); 
    counters[2] = measure_time(); 
    do_another_thing(); 
    counters[3] = measure_time(); 
    do_one_last_thing(); 
    counters[4] = measure_time(); 
} 

是否有通過預處理器(似乎不太可能)或模板來維護和增加整數狀態的方法?

我知道我能做到這一點:

void ISR() 
{ 
    int i = 0; 
    counters[i++] = measure_time(); 
    do_something(); 
    counters[i++] = measure_time(); 
    do_something_else(); 
    counters[i++] = measure_time(); 
    do_another_thing(); 
    counters[i++] = measure_time(); 
    do_one_last_thing(); 
    counters[i++] = measure_time(); 
} 

,但有一些額外的價值具有編譯時指數(這是很難解釋這裏的W/O進入一些專有細節)


編輯:這是一個嵌入式系統,並__COUNTER__不可用(我剛剛試了一下:__COUNTER__不是由我的編譯器或預處理器定義的),我不知道我能得到升壓工作,至少不在其en tirety。

+2

有關預處理器計數器,請參見http://stackoverflow.com/questions/1132751。 – Tobias 2012-03-01 16:58:53

+1

[C++是否支持編譯時計數器?](http://stackoverflow.com/questions/6166337/does-c-support-compile-time-counters) – 2012-03-01 17:14:13

+1

...實際上解決方案http: //stackoverflow.com/a/6210155/44330似乎可能工作。 – 2012-03-01 17:14:27

回答

4

__COUNTER__宏是你的朋友。

+1

請記住,Boost,例如,使用這個宏,所以如果你包含某些頭文件,你的'__COUNTER__'可能不會從0開始。 – 2012-03-01 17:03:11

+0

不在我的系統上,它不是。 :-( – 2012-03-01 17:04:47

2

counters.push_back(measure_time())怎麼樣?

+0

不,我正在尋找編譯時解決方案(更不用說我的低嵌入式系統中沒有STL;我只是很幸運,我擁有C++和模板) – 2012-03-01 17:11:32

1

獲取boost源代碼。看看BOOST_PP_COUNTER是如何工作的(期望讓人頭疼)。然後在您的代碼中複製功能。或者乾脆使用boost。請注意0​​確實是不是使用__COUNTER__