1

イベントをイベントキューに投稿するこのマクロを入手しました。

POST_(myTarget, event)

イベントは、ローカルキューに直接送信されるか、シリアル化されて、イベントを別のマイクロコントローラに送信する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

したがって、すべての情報はコンパイル時に存在しますが、プリプロセッサに何をすべきかを指示する方法がわかりません。

  • ローカル/リモート定義に応じて、ターゲットごとに2つのマクロを作成できますが、これは面倒です。
  • 実行時にテストを行うこともできますが、これも悲しい話です。

編集:

プログラムがより明確に見える例:

#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)                              \
      )

秘訣は、ターゲットごとに常に1つのマクロを用意する必要があるということです。あなたが最初の選択肢が欲しい人のためにあなたはトークンにそれを持っています1。他の人がすることを宣言することを省略することもできます0

一般的な形式は次のようなものです

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

上記でできることはたくさんありますCOND。特定のトークンとの同等性、10進数の同等性、パラメーターリストの空性のテストなどです。

于 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
#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 に答える
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 に答える