2

私はこのコードを持っています:

#ifdef something32                           <----- might not be defined
    the_real_value = thing[something32];
    thing[something32] = my_value;
#else
    the_real_value = thing[something];   <------- guarantied to be defined (something)
    thing[something] = my_value;
#endif

#ifdef THE_OTHER_THING                       <--------- might not be defined
#ifdef something32
    thing32[something32] = my_value;
#else
    thing32[something] = my_value;
#endif
#endif

私はそれを何度も使用するので、マクロに置き換えたいと思います。私は #ifdef がマクロ内に存在できないことを知っているので、そのすべてのコードを他にどのように置き換えることができるか疑問に思っています。何か案は?

編集:

申し訳ありませんが、これはsomething32非常に長い変数リストの 1 つにすぎないことを忘れていました。

アイデアは、次のようなものを持つことです

SHORTEN_MY_CODE(something, something32);
SHORTEN_MY_CODE(another_something, another_something32);
etc...
4

2 に答える 2

0

C++ を使用している場合は、関数を記述してインラインで宣言することを検討します。完全な関数がある場合は、#ifdef を関数内に配置できます。

コードをもっと投稿していただければ、より多くの支援を提供できると思います。c プリプロセッサの誤用が蔓延しています。おそらく、提案した方法で使用したくないでしょう。

方法がわからずsomething、定義されますsomething32OTHER_THINGそれらはプロジェクトレベルで定義されていますか、それともヘッダーファイル内で定義されていますか?


更新:提案。ただし、最初にこれを読むことをお勧めします:カーネル 2.6+ での sys_call_table へのアクセス

void* Hook(int f, void* hooked) {
#ifdef CONFIG_IA32_EMULATION
    void *old = ia32_sys_call_table[f];
    ia32_sys_call_table[f] = hooked;
#else
    void *old = sys_call_table[f];
    sys_call_table[f] = hooked;
#endif
    return old;
}


...

Hook(__NR_read, hooked_sys_read);
Hook(__NR_write, hooked_sys_write);
于 2013-04-19T19:37:21.187 に答える