2

Cコードに関数のレジストリがあり、コンパイル時にカスタム関数をレジストリに登録するための API を提供する必要があります。

例: コードの「顧客」側は次のようになります。

int a_test_function_a(){
    return 13;
}
int init(void){
    add_command(a_test_function_a);
}

私のレジストリ コードでは、次のマクロを定義しました。

#define add_command(NAME)   do{                 \
    command_registry = avl_tree_add(            \
    command_registry                            \
    , #NAME                                     \
    , &##NAME                                   \
    , &command_handler);                        \
    } while(0)

これが私が理解していないことです。gcc -E の出力は、期待どおりに文字列を置き換えます。

do{ command_registry = avl_tree_add( command_registry , "a_test_function_a" , &a_test_function_a , &command_handler); } while(0);

しかし、コンパイラはエラーをスローします:

src/commands/commandRegisterTest.c:18:5: error: pasting formed '&a_test_function_a', an invalid
  preprocessing token
add_command(a_test_function_a);
^
src/commands/../../../src/commands/command_api.h:18:8: note: expanded from macro 'add_command'
, &##NAME                                   \
   ^
1 error generated.

どうすればこれを行うことができますかadd_command('name', &function);。自分で呼び出す必要はありません。関数を名前で登録し、それを呼び出すだけadd_command(name)です。解決策以外に、プリプロセッサが行を置き換えても失敗するのはなぜですか? これは私には意味がありません。

4

1 に答える 1