我是一个相当有经验的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;
}
答案 0 :(得分:4)
在C中,您必须通过指针传递,因此您可以像这样定义printItem
:
void printItem(struct structItem *item)
{
printf("age: %i, price: %i", item->age, item->price);
}
要调用它,请指向它。 E.g:
printItem(&item);
答案 1 :(得分:2)
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
的指针,修改函数以使用{ {1}}通过指针访问结构成员,完整的程序是:
->
答案 2 :(得分:2)
引用是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);
答案 3 :(得分:1)
引用不是C语法的一部分,因此您必须将其更改为您在问题中提供的void printItem(const struct structItem *const item)
签名,并相应地更改调用,即printItem(&item);
即使Jon Skeet这么说:Does C have references?
答案 4 :(得分:0)
如果结构很小,你也可以通过值传递:
void printItem(struct structItem item) {
printf("age: %i, price: %i\n", item.age, item.price);
}
这个更快,因为不需要解除引用,并且通过值传递可以清楚地表明该项目不会被修改。
答案 5 :(得分:-1)
似乎导致构建中断的问题是
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
正如所料。