[英]c-code reference to a struct
我是一個相當有經驗的C ++程序員,但是(純粹的!?)C代碼我有時會掙扎,特別是當我有一段時間沒有使用它時。 有人可以給我一個暗示,為什么下面的代碼不起作用? 編譯說:
syntax error : missing ')' before '&'
抱怨有printItem簽名的行。 我怎么能讓它發揮作用? 是將printItem-signature更改為的唯一選項:
void printItem(const struct structItem *const item)
{
printf("age: %i, price: %i", item->age, item->price);
}
或者有另一種方式,這將允許我保持簽名,因為它在下面? 另外,...我沒有為結構使用更方便的“typedef”表示法,因為我記得有些問題 - 可能在這個上下文中。 如果有人能說清楚這一切,我會非常感激。
#include <stdio.h>
struct structItem {
int age;
int price;
};
void printItem(const struct structItem &item)
{
printf("age: %i, price: %i", item.age, item.price);
}
int main()
{
struct structItem item;
item.age = 1;
item.price = 200;
printItem(item);
getchar();
return 0;
}
在C中,您必須通過指針傳遞,因此您將定義printItem
如下所示:
void printItem(struct structItem *item)
{
printf("age: %i, price: %i", item->age, item->price);
}
要調用它,給它指針。 例如:
printItem(&item);
int main()
{
struct structItem item;
item.age = 1;
item.price = 200;
printItem(item);
此時,您將整個結構傳遞給printItem()
函數。 編譯器(在語義上,如果不是實際) 將結構復制到您的函數的臨時存儲中。 如果要傳遞item
結構的地址 ,請修改調用:
printItem(&item);
無論如何,你需要修改printItem()
的原型,因為這不合法C:
void printItem(const struct structItem &item)
GCC拋出一個錯誤:
$ make item
cc item.c -o item
item.c:8:40: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
在函數原型中更改&
到*
,聲明函數接受structItem
的指針 ,修改函數使用->
通過指針訪問結構成員,完整的程序是:
#include <stdio.h>
struct structItem {
int age;
int price;
};
void printItem(const struct structItem *item)
{
printf("age: %i, price: %i", item->age, item->price);
}
int main()
{
struct structItem item;
item.age = 1;
item.price = 200;
printItem(&item);
getchar();
return 0;
}
引用是C ++語法。 在純C中,您只能使用Pointers進行call-by-reference 。
void printItem(const struct structItem* const item) {
printf("age: %i, price: %i", item->age, item->price);
}
並且要小心函數調用。 你需要用結構的地址來調用它。
struct structItem item;
item.age = 1;
item.price = 200;
printItem(&item);
引用不是C語法的一部分,因此您必須將其更改為您在問題中提供的void printItem(const struct structItem *const item)
簽名,並相應地更改調用,即printItem(&item);
甚至Jon Skeet也這樣說: C有參考嗎?
如果結構很小,您可以通過值傳遞:
void printItem(struct structItem item) {
printf("age: %i, price: %i\n", item.age, item.price);
}
這樣更快,因為不需要解除引用,並且通過值傳遞可以清楚地表明該項目不會被修改。
似乎導致構建中斷的問題是
void printItem(const struct structItem *const item)
沒有理由兩次使用const
關鍵字; 事實上,這是非法的。 即使標准符合性提高了,我仍然可以編譯
#include <stdio.h>
struct structItem {
int age;
int price;
};
void printItem(const struct structItem *item) {
printf("age: %i, price: %i\n", item->age, item->price);
}
int main(void) {
struct structItem item;
item.age = 10;
item.price = 100;
printItem(&item);
return 0;
}
沒問題,程序打印
age: 10, price: 100
正如所料。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.