1

我得到了将事件发布到某个事件队列的宏。

POST_(myTarget, event)

事件可以直接发布到本地队列,也可以序列化并发布到 I2C 服务的事件队列,该 I2C 服务将事件发送到另一个微控制器。接收服务是本地服务还是远程服务的定义如下:

#define myTarget_REMOTE
#define anotherTarget_LOCAL

我想做的是这样的(这当然是不允许的):

#define POST(target, e) \
    #ifdef target##_REMOTE \
        /* create a i2c request-event with serialized(e) 
           as parameter and post to I2c-Manager */
    #else \
        /* post directly */
        POST_(target, event) \
    #endif

所以,所有信息在编译时都在那里,但我不知道如何告诉预处理器该做什么。

  • 我可以根据其本地/远程定义为每个目标创建两个宏,但这会很麻烦。
  • 我可以在运行时进行测试,但这也是一个悲伤的故事。

编辑:

程序看起来更清晰的示例:

#define target1_LOCAL
#define target2_REMOTE

POST(target1, e) ==preprocessor==> POST_(target1, e)

POST(target2, e) ==preprocessor==> 
    do { \
        req = createI2cRequest(serialize(e)); \
        POST_(I2cManager, req); \
    }while(0)

所以,在我刚刚使用的程序POST(target, event)中,目标的位置是完全透明的。

4

4 回答 4

1

宏内的条件编程有点棘手,但可以使用 C99。在P99中,我编写了一系列条件语句,在这里可能会有所帮助。

#define myTarget_TYPE 0
#define anotherTarget_TYPE 1

#define POST(target, e)                                   \
    P99_IF_EQ_1(P99_PASTE2(target, _TYPE))                \
      (                                                   \
        /* create a i2c request-event with serialized(e)  \
           as parameter and post to I2c-Manager */        \
      )(                                                  \
        /* post directly */                               \
        POST_(target, event)                              \
      )

诀窍是您应该始终为每个目标拥有一个宏。对于那些你想要第一个替代方案的人来说,你可以使用 token 1。你甚至可以省略声明其他人是 to 0

一般形式类似于

P99_IF_COND( /* expression(s) for condition */ )(/* case true */)(/* case false*/)

您可以在上面做很多事情COND,测试与特定标记的相等性、十进制数的相等性、参数列表的空性......

于 2012-09-03T22:10:36.747 回答
1

所以我终于想通了。诀窍是使用预处理器为编译器提供所有需要的信息,并依靠编译器来优化 if/else 。

#define REMOTE  1
#define LOCAL   0

#define TARGET0_LOCATION REMOTE
#define TARGET1_LOCATION LOCAL

#define TEST(target) do { \
        if(target##_LOCATION == REMOTE) printf("REMOTE\n"); \
        else printf("LOCAL\n"); \
    }while(0)

main(){
    TEST(TARGET0);
    TEST(TARGET1);
}

输出:

REMOTE
LOCAL
于 2012-09-04T08:40:59.753 回答
0

拉出一些定义,例如:-

#ifdef I2C
#define TARGETFUNC _REMOTE
#else
#define TARGETFUNC _LOCAL
#endif
#define POST(target, e) POST(target##TARGETFUNC,e)
于 2012-09-03T20:23:22.037 回答
0
#define post_myTarget(x)       remote_post(x)
#define post_anotherTarget(x)  local_post(x)

#define POST(target, e) post_##target(e)
于 2012-09-03T20:42:13.350 回答