c-код ссылки на структуру - PullRequest
4 голосов
/ 21 февраля 2012

Я довольно опытный программист на C ++, но с (чистым !?) C-кодом я иногда борюсь, особенно когда я его давно не использовал. Может кто-нибудь подсказать, почему не работает приведенный ниже код? Компилятор говорит:

syntax error : missing ')' before '&'

жалуется на строку с подписью printItem. Как я могу заставить это работать? Это единственная возможность изменить printItem-подпись на:

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;
}

Ответы [ 6 ]

4 голосов
/ 21 февраля 2012

В C вы должны пройти по указателям, чтобы вы определили printItem следующим образом:

void printItem(struct structItem *item)
{
    printf("age: %i, price: %i", item->age, item->price);
}

Чтобы вызвать его, дайте ему указатель.Например:

printItem(&item);
2 голосов
/ 21 февраля 2012

Ссылки имеют синтаксис C ++. В чистом C вы можете использовать вызов по ссылке с указателями.

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);
2 голосов
/ 21 февраля 2012
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;
}
1 голос
/ 21 февраля 2012

Ссылки не являются частью синтаксиса C, поэтому вам придется изменить его на подпись void printItem(const struct structItem *const item), которую вы дали в вопросе, и соответственно изменить вызов, то есть printItem(&item);

EvenДжон Скит говорит так: Имеет ли C ссылки?

0 голосов
/ 21 февраля 2012

С такой небольшой структурой вы могли бы также передать значение:

void printItem(struct structItem item) {
    printf("age: %i, price: %i\n", item.age, item.price);
}

Это быстрее, поскольку разыменование не требуется, а передача по значению дает понять, что элемент не будет изменен.

0 голосов
/ 21 февраля 2012

Проблема, которая, по-видимому, вызывает перерыв в сборке:

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

, как ожидалось.

...