【发布时间】:2014-07-08 14:05:30
【问题描述】:
我有一个 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
根据#defines 是否相同,我有一些不同的初始化代码。从概念上讲,我想要这样的代码:
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}
};
如果两个任意宏具有相同的定义,是否有可靠的方法在编译时进行测试?
【问题讨论】:
-
平台是否没有提供任何其他宏来指示正在为哪个平台编译代码?
-
您能否为平台 2 设置一个标志
#define以指示端口是共享的,然后在填充callbacks数组时测试该标志? -
我认为您必须通过代码(即在运行时)初始化
callbacks数组。在全局变量的情况下 - 是的,这是一段额外的代码,但鉴于它只运行一次,它不太可能影响应用程序的整体性能。在局部变量的情况下,无论如何都会发生“代码初始化”,因为每次调用函数时数组都必须保留其初始值。因此,即使您确实有一些“神奇”的方法来使用宏,它也不会产生重大影响(最多会为您节省额外的if)。 -
我看不出链接的问题是如何相关的。我的#defines 不是字符串,它们是变量名(或者可能是它们的地址)。
-
可能的重复与它描述在 C 预处理器中比较纯(整数)数字表达式以外的事物有关 - 并且在某种程度上它有相同的答案:不,你可以不要这样做。 C 预处理器是一个有趣的工具,但它有局限性,而您正在寻求超越这些局限性。
标签: c c-preprocessor