2017-04-14 88 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