簡體   English   中英

對結構的c代碼引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM