C ++编译时状态变量

时间:2012-03-01 16:55:26

标签: c++ templates c-preprocessor compile-time

我有兴趣能够做这样的事情:

 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();
 }

但是拥有编译时索引还有一些额外的价值(这里很难解释这些索引,而不会进入某些专有细节)


编辑:这是在嵌入式系统上,并且__COUNTER__不可用(我只是尝试过:我的编译器或预处理器没有定义__COUNTER__),我不确定我可以让Boost工作,至少不是完整的。

3 个答案:

答案 0 :(得分:4)

__COUNTER__宏是你的朋友。

答案 1 :(得分:2)

counters.push_back(measure_time())怎么样?

答案 2 :(得分:1)

获取boost源代码。了解BOOST_PP_COUNTER的工作原理(期望让人头痛)。然后在代码中复制功能。或者只是使用提升。请注意BOOST_PP_COUNTER 使用__COUNTER__