您如何测试两个#define与C预处理程序是否相同

贝壳

我有一个C程序,该程序具有特定于平台的定义,用于访问低级硬件。在某些平台上,两个宏指向同一变量,而在其他平台上,它们却不同:

 //Platform_One.h
 #define FOO_PORT   (io.portA)
 #define BAR_PORT   (io.portB)

 //Platform_Two.h
 #define FOO_PORT   (io.portC)
 #define BAR_PORT   (io.portC)  //same

根据#define是否相同,我有一些不同的初始化程序代码。从概念上讲,我想要这样的代码:

 callback_struct_t callbacks[] = {
 #if FOO_PORT == BAR_PORT           //unfortunately invalid
     {&FOO_PORT, handle_foo_bar_func},
 #else
     {&FOO_PORT, handle_foo_func},
     {&BAR_PORT, handle_bar_func},
 #endif          
      {0,0}
 };

如果两个任意宏的定义相同,是否有可靠的方法在编译时进行测试?

胸部

您不能将预处理器宏作为字符串进行比较。一种可能是将硬件端口地址(例如,通过平台专用标头中的另一个宏)放入#defines,然后比较地址。

但是,最简单的方法可能是在实际代码中进行地址比较,例如:

if (&FOO_PORT == &BAR_PORT) {
    // populate callbacks with handle_foo_bar_func
} else {
    // populate callbacks with handle_foo_func and handle_bar_func
}

尽管未在预处理器中完成,但编译器可能能够优化掉未使用的分支,因为硬件地址可能是编译时常量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章