2012-02-20 19 views
4

私はかなり経験豊富なC++プログラマーですが、(純粋な!?)Cコードを使用すると、時々苦労します。誰かが私に以下のコードがうまくいかない理由についてのヒントを与えることができますか?コンパイラは言う:構造体へのcコードの参照

syntax error : missing ')' before '&' 

は、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

Cコードが機能していないと言ったらどういう意味ですか?コンパイルしていない、フォルトしている、または間違った答えを出していませんか? –

+0

ああ、それはコンパイルされていません。私はテキストを編集します。ごめんなさい。 – AudioDroid

+0

@AdamMihalcin:Cプログラムで、参照を示すために '&'を使用しようとしています。あなたは本当に何がうまくいかないのか尋ねなければなりませんか? – ruakh

答えて

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); 
+0

Danke Jan.あなたが最初であり、答えが最も正確です!しかし、みんなに感謝します! – AudioDroid

1

の参照は、Cの構文の一部ではないので、あなたは、あなたが質問に与えたvoid printItem(const struct structItem *const item)署名にそれを変更する必要があり、すなわち、それに応じてprintItem(&item);

でもジョンスキートの呼び出しを変更しますそう言う:あなたはこのようなprintItemを定義するように、CでDoes C have references?

4

は、あなたがポインタで渡す必要があります。

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

これを呼び出すには、ポインタを与えます。例えば:この時点で

printItem(&item); 
2
int main() 
{ 
    struct structItem item; 
    item.age = 1; 
    item.price = 200; 

    printItem(item); 

、あなたはprintItem()関数に構造全体を渡しています。コンパイラは意味的に(実際にはそうでない場合)のコピーをあなたの関数の一時記憶域にコピーします。

void printItem(const struct structItem &item) 
:これは法律上のCではないとしてあなたが、とにかく printItem()のプロトタイプを改正する必要があります

printItem(&item); 

:あなたはitem構造のアドレスを渡したい場合は、コールを修正

$ make item 
cc  item.c -o item 
item.c:8:40: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token 

変更&をする:

GCCでエラーが発生します関数プロトタイプ210、関数ポインタを介して構造体メンバにアクセスする->を使用する機能を修正、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

問題そのビルドブレークを引き起こしていると思わ

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 

をコンパイルすることができます。

+1

Hm。私はconstキーワードを2回使用することは問題ではないと思います。私は関数内でポインタをリダイレクトしないことを保証します。私はちょうどそれを試みた。 2番目のconstでは、ポインタをリダイレクトできません。それは私が望むものであり、うまくいきます。 – AudioDroid

0

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

これは全く逆参照が必要とされないため、高速で、値によって渡すと、それは明らか項目はならないことになり変更されました。

+0

この特定の文脈で私は同意します。しかし、私はこの問題を絞り込むためにこの例を作りました。私の実際の例では、構造体はもっと大きくなっています。 – AudioDroid

関連する問題