2

私は80年代後半のCコードを見ています。私は次の定義を持っています。

void (*_flush())(){ /* body ommitted */ }

これは、引数リストとしての関数であり_flush、戻り値と引数リストとしてvoidの関数ポインターを返すvoidと思いますvoid

2 つの部分で同等:

typedef void (*funcptr)(void);
functptr flush(void){  /* body ommitted */ }

古い表記を正しく理解していますか?

4

2 に答える 2

2

はい、あなたの理解は(ほぼ)正しいです:

cdecl> explain void (*_flush())()
declare _flush as function returning pointer to function returning void

voidただし、関数が引数リストとして持っていると言うのは正しくありません。次のような関数:

void func()

引数を取りません。指定されていない数の引数を取ります。次のいずれか適切な方法で呼び出すことができます。

func()
func(a);
func(a, b, c);

等々。の実装_flushパラメーターを使用しない場合、おそらくvoid提案どおりに安全に使用できますが、例には十分な情報が含まれていません。

良いリファレンス:パラメーターのない C 関数の動作

于 2013-08-28T00:17:36.577 に答える
0

関数の適切な翻訳を取得するには、http://www.cdecl.org/を使用してください。

void (*_flush())()
declare _flush as function returning pointer to function returning void

関数の定義で_flush()パラメーター自体が使用されていた場合、それらは最後のパラメーターの間にリストされている)ため、関数が引数を取らない{と確信できます。_flush

void (*_flush())() { /* body omitted */ }
//----------------^

の戻り値flushはそれ自体が関数です。それを呼び出しましょうfoo

void foo(...)
declare foo as function returning void

ここで、関数が を返すことがわかっていますvoidが、そのパラメーター リストは、任意の数のパラメーターおよび任意の型の任意の数である可能性があります。与えられた情報からはわかりませんが、 の本体から識別できる可能性があります_flush

于 2013-08-28T02:16:08.903 に答える