3

マクロ引数として提供された文字列を文字列化解除する方法はありますか? 名前が文字列になっている関数を呼び出せるようにする必要があります。このようなもの:

void hello() {
    printf("Hello, world!");
}

call_func("hello");

call_func をどのように実装しますか。それは#included になるモジュールにあり、メインの c ファイルで関数を呼び出すために使用されます。これを行う別の方法があれば、名前を文字列にする必要はありませんが、引数として関数に渡すことができます。これが私が意味することです:

#define call_func(X) X()
void do_something(Some_kind_of_C_func_type i) {
    call_func(i)
}
void hello() {
    printf("Hello, world!");
}

do_something(C_FUNC(hello));
4

2 に答える 2

1

わかりました。目的に応じて、これを行うには 2 つの方法があります。

最初は関数ポインタです。基本的に関数を変数として扱います。簡単な概要については、こちらを参照してください。

または、その方法で呼び出したいコードを共有ライブラリとして構築し、dlopen() または LoadLibrary() などを使用してライブラリを開き、その後、いずれかのインターフェイスを使用して変数/関数にアクセスすることもできます。

于 2010-08-28T18:32:45.590 に答える
0

何を達成したいかは完全には明らかではありませんが、マクロを使用して実行時に入力された文字列を取得し、同じ名前の関数を解決することはできません。

できることは、すべての関数をリスト (またはもう少し洗練されたデータ構造) に登録し、名前で呼び出すことです。

#define INSERT(fn) addfn(#fn, &fn)
void addfn(char const* name, func_t fp);

addfn発行されたポインターを取得して、エントリの下の辞書に入れることができる場所name

于 2010-08-28T18:39:15.183 に答える