10

これが構造体宣言コードです。

struct list_el {
    int val;
    struct list_el * next;
};

typedef struct list_el item;

そして、このような関数を書くと、コンパイラはエラーを出します。それは言いcur undeclared before first useます。

bool delete(item* item)
{
    assert(item != NULL);

    item* cur = NULL;
    cur = head;
    item* prev = NULL;
    while (cur) {
        if (cur == item) {
            if (prev == NULL) {
                head = item->next;
            } else {
                prev->next = item->next;
            }
            free(item);
            return true;
        }

        prev = cur;
        cur = cur->next;
    }
    return false;
}

リファレンスを調べたところ、 のようにうまくtypedefいく#define書かれています。コンパイル時に単に置換を行います。それがコードをコンパイルできない理由ですか?

4

5 に答える 5

17

このコードでは:

bool delete(item* item)
{
    item *cur = NULL;

3行目のは、型ではなく、変数(関数のパラメーター)itemの名前と見なされます。したがって、3行目は、未定義の変数itemを乗算する式として開始されているように見えます。これにより、問題が発生します。表現の残りの部分も偽物です。itemcur

これが希望どおりでない場合は、型と変数に同じ名前を使用しないでください。自分自身とコンパイラを混同しなくても、他の人を混乱させるでしょう。


どちらの参照ソースが「同じ」であるtypedefと言ったとしても、今すぐ参照リストから削除する必要があります。このような根本的に異なる2つの構成を区別できない場合、誤解を招く時期がわからないため危険です(ただし、これは誤解を招く1つのケースです)。#define

于 2012-11-14T07:19:50.873 に答える
2

typedef は、既存の型の単なる新しい名前です。定義はプリプロセッサによって処理されますが、typedef は C コンパイラ自体によって処理されます。[このリンク からコピー]

この質問を確認してください: typedef と #define は c で同じですか?

于 2012-11-14T07:28:29.493 に答える
1

typedefと完全に同じではありません#define

例による違いは次のとおりです。

#define cptr1 char*

typedef char* cptr2;

コード内:

           int main()
            {
             cptr1 c1,c2; // first case : 
        // here c1 will be pointer to char but c2 is only char as cptr 
   // is directly replaced by char* by preprocessor
            cptr2 c3,c4; // second case :
      // here c3 and c4 both are pointers to char 
            }
于 2012-11-14T07:25:31.560 に答える
1

-Wshadowコードをコンパイルするときに使用する必要があります。次に、gcc はどこが間違っているかを教えてくれます。:-) 次のように:
declaration of ‘item’ shadows a global declaration [-Wshadow]

于 2012-11-14T07:38:55.823 に答える
1

ジョナサン・レフラーがあなたの質問に答えました。

追加したいのは、コードを C++ で記述する場合、typedef を使用する必要がないため、次のようにリストを実装できることです。

struct list_el {
    int val;
    list_el *next;
};

bool delete_element(list_el *item)
{
    list_el *cur = NULL;
    ...
}
于 2012-11-14T07:40:08.877 に答える