我几乎可以肯定答案是'不'.但我很固执; 我真的很想实现这个功能,循环很重要(阅读:嵌入式).
目标:
对于这个嵌入式应用程序,我有一个需要内联的时钟配置序列.到处都是.我想用宏来做这件事.
问题
时钟配置的执行顺序随参数'f'(新时钟频率)而变化.
- if (f>10) do A first
- if (f<=10) do A last
- f is a compile time constant.
Run Code Online (Sandbox Code Playgroud)
例
#define setup_post10(f) doA(f); \
doB(f); \
doC(f)
#define setup_pre10(f) doB(f); \
doC(f); \
doA(f)
Run Code Online (Sandbox Code Playgroud)
题
如何通过简单的设置(f)封装它?我想:
#define set(f) #if(f>10) \
setup_post10(f) \
#else \
setup_pre10(f) \
#end
Run Code Online (Sandbox Code Playgroud)
但是在宏定义中使用预处理程序指令(例如#if)是无效的(据我所知).
有没有办法做到这一点?对于我的应用,每个周期(和闪存的字节)都很珍贵; 我很固执 我想在我的代码中使用这种抽象级别.
谢谢!
-Justin
查看 Boost 预处理器库 ( http://www.boost.org/doc/libs/1_55_0/libs/preprocessor/doc/index.html )。它包括一种执行此类操作的方法 - 特别是,它具有BOOST_PP_LESS.
尽管如果您只针对特定的编译器,那么只使用函数而不是宏并强制将其内联可能会更容易。然后if,您可以使用 simple ,并依靠优化器将其优化为常量参数。我认为,较新的 GCC 版本甚至可以断言某些值是编译器时常量,这几乎可以保证if永远不会实际发出。
如果每个周期都很珍贵,那么你应该在装配中进行编码.:)
如果您信任C编译器优化器,那么就这样做
#define set(f) if((f)>10) setup_post10(f) \
else setup_pre10(f)
Run Code Online (Sandbox Code Playgroud)
如果f是常量,则编译器将仅选择其中一个条件分支进行编译,假设您已启用最小化优化.例如,set(11)应该直接转换为调用setup_post10(11)