2017-04-14 85 views
-1

我通過引用將結構傳遞給函數,因爲我想修改函數內部的結構。但是,編譯器在「++ kpad.pin_chars;」處不斷給我提供「Error C1421:Undefined class/struct/union」。我錯過了什麼?這裏是我的測試代碼:如何修改通過引用傳遞的結構?

struct Keypad{ 
    int pin_chars; 
}; 


void check_keypad(struct Keypad *kpad); 


void main(void){ 
    struct Keypad kpad; 
    kpad.pin_chars = 0; 
    check_keypad(&kpad); 
} 


void check_keypad(struct Keypad *kpad){ 
    ++kpad.pin_chars; 
} 
+0

在功能check_keypad,KPAD是一個指向結構,而不是結構本身 – Cloverr

+0

既不確實支持C類也沒有提及。該錯誤消息不是來自C編譯器,而是來自C++。這是一種不同的語言,不要垃圾標籤!雖然C++支持引用,但您的代碼中沒有任何代碼;一個指針不是一個參考! – Olaf

+0

從ym的評論,你讀了我不明白這個問題?請參加[導覽],看看有哪些評論和答案。也許你注意到下面的帖子是以「答案」爲標題,而不是評論。 – Olaf

回答

1

你傳遞一個指針,使用struct Keypad *kpad語法。這是*的一部分。

當你傳遞一個指針時,你不能使用「點」來訪問一個沒有先指定的引用指針。您必須取消引用,或使用「箭頭」(->)作爲運營商:

++ *kpad.pin_chars 

++kpad->pin_chars 

一般情況下,使用指針箭頭語法時是首選的方法。

編輯:

值得指出所涉及的各種運營商的precedence。後綴++(和--)具有相同的優先級作爲.->,但將結合構件在ptr->member++由於位置,而前綴++(和--)具有比.->一個低優先級,並且因此結合的結果成員訪問表達式作爲優先級的結果,而不是位置。

你以兩種略有不同的方式得到結果。

+1

你不*有*使用箭頭操作符。對於更詳細的'(* kpad).pin_chars',它只是一些語法糖。 – StoryTeller

+0

非常感謝!我花了幾個小時。 – R01k

1

由於您通過地址傳遞參數,因此需要取消引用它以獲取其值。下面的代碼工作:

void check_keypad(struct Keypad *kpad){ 
++((*kpad).pin_chars); 
} 

C提供另一種格式用於相同的目的:

void check_keypad(struct Keypad *kpad){ 
++(kpad->pin_chars); 
} 
+0

謝謝Arash。 – R01k