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)
です。解決策以外に、プリプロセッサが行を置き換えても失敗するのはなぜですか? これは私には意味がありません。