2017-09-13 11 views
-3

私のコードは以下の通りですが、なぜlvalueが起きているのかという問題も以下に説明されています。lvalueはc関数ポインタの単項 '&'オペランドとして必要です

typedef struct test_item 
{ 
    char id[MENU_NAME_LEN + NULL_SPACE]; 
    MenuFunction function; 
} test_item; 

typedef void (*MenuFunction)(VmSystem *); 

と私は私が必要な次のようなエラーlvalueを取得する関数ポインタを代入しようとしたとき、私は私がしかし、何をしたいとIDを割り当てることができています

void display(VmSystem * system) 
{ 
    printf("test"); 
} 

単項として&オペランド

test_item test; 
test.function = &display(system); 
+1

'()'が後に続く関数名は、関数を呼び出すことを意味します。 '()'のない関数名は、関数のアドレスを意味します。 – Gerhardh

+0

私はあなたがここで何をしようとしているのか分かりませんが、 'display(system)'は 'display 'という関数からの戻り値のアドレスをあなたに提供するようにCに求めています。ただし、この値はプロセッサレジスタに返されます。それは全くアドレスを持っていません。だから 'test.function =&display(system);'という行は意味をなさない。 –

+0

@Johnny S書き込みtest.function = **********表示; –

答えて

4

あなたが意味:

test.function = display; 

()display後の手段をその関数を呼び出すこと。ちょうどdisplayは関数へのポインタに評価されます。 &displayの必要はありません。

+0

ありがとう、私は後で私は次のメッセージを取得しようとすると、この時間を間違っている - "引数の1つの 'test->関数'の互換性のないポインタ型から渡す"このコードスニペットで呼び出す; test.function(system) –

+0

@JohnnySそして 'system'とは何ですか?それは問題につながるかもしれない[同じ名前の標準機能](https://linux.die.net/man/3/system)を隠しているので、日陰の変数名です。 – unwind

+0

私は "typedef void(* MenuFunction)(VmSystem *);"と読みました。 2番目の()は関数の入力ですので、VmSystemの名前だけですが、間違っている可能性があります –

関連する問題