具有条件扩展的GCC宏?

J-D*_*zle 2 c macros gcc

我几乎可以肯定答案是'不'.但我很固执; 我真的很想实现这个功能,循环很重要(阅读:嵌入式).

目标:

对于这个嵌入式应用程序,我有一个需要内联的时钟配置序列.到处都是.我想用宏来做这件事.

问题

时钟配置的执行顺序随参数'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

fgp*_*fgp 5

查看 Boost 预处理器库 ( http://www.boost.org/doc/libs/1_55_0/libs/preprocessor/doc/index.html )。它包括一种执行此类操作的方法 - 特别是,它具有BOOST_PP_LESS.

尽管如果您只针对特定的编译器,那么只使用函数而不是宏并强制将其内联可能会更容易。然后if,您可以使用 simple ,并依靠优化器将其优化为常量参数。我认为,较新的 GCC 版本甚至可以断言某些值是编译器时常量,这几乎可以保证if永远不会实际发出。


Mar*_*ata 5

如果每个周期都很珍贵,那么你应该在装配中进行编码.:)

如果您信任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)