2016-04-05 35 views
3

Uygulamamda benzer yapıya sahibim. çizgisindeÇözünürlük uyarısı C4133: '=': uyumsuz türler - yapıdan yapıya

typedef struct _Test 
    { 
     int n; 
     struct Test *Next; 
    }Test; 

int main(int argc, char **argv) 
{ 
    Test tmp, tmp1; 

    tmp.n = 1; 
    tmp.Next = NULL; 

    tmp1.n = 0; 
    tmp1.Next = &tmp; 

    return 0; 
} 

aşağıdaki uyarı mesajını alıyorum

tmp1.Next = &tmp; 

: uyarı C4133: '=': uyumsuz türleri - 'Test *'

için 'Test *' dan neler Yukarıdaki kod ile yanlış mı?

+6

'struct Deneyi * Sonraki;' -> 'struct _Test * Next;' – BLUEPIXY

+0

Buradaki asıl konu uyarıdır ... '' Test * ''den' 'struct' 'türüne kadar uyumsuz türler olmalıdır. * ' '*. – dreamlax

cevap

7
typedef struct _Test 
{ 
    int n; 
    struct Test *Next; // --> struct Test is not a type here 
}Test; 

O hatalar ile sona erecek başka geçerli bir veri türü olmalıdır herhangi bir nesne tanımlamak üzere Yani

typedef struct _Test 
{ 
    int n; 
    struct _Test *Next; // --> struct _Test is a type 
} Test; 

olmalıdır.

+1

Niçin 'struct Sınaması * yazmalı? –

+0

@EdgarRokyan Üzgünüm ne? – Gopi

+1

Yani "Test" adında bir yapımız yok, "struct Test * Next", geçerli yapı gibi görünüyor ... –

4

Eğer varsa:

typedef struct _Test 
{ 
    int n; 
    struct Test *Next; 
} Test; 

_Test adı etiketi ad bulunmaktadır. Bu tür bir yapıyı struct _Test kullanarak bildirebilirsiniz. Yapı tanımınızın içinde struct Test kullanın. Bu ada sahip bir yapı bildirilmediğinden, eksik bir tür olarak kabul edilir. Tamamlanmamış bir yapı tipine bir işaretçinin bulunması yasaldır, ancak tamamen bildirilene kadar bunun geçersiz kılınması yasa dışıdır.

Bu tanımlayıcılar rezerve edildiği için, altçizgi ile başlayan adların ve ardından büyük harfle başlamamanız gerekir. Eğer struct Test yazıp her yerde sadece Test yazmak istediğiniz istemiyorsanız eğer yukarıda takip edebilirsiniz,

struct Test 
{ 
    int n; 
    struct Test *next; 
}; 

Veya:: Daha iyi olmadığı için,

typedef struct Test Test; 

Bu Sen kullanmalıdır kelimeler, etiket ad alanı dışına Test adını kopyalar, böylece önceki struct anahtar sözcüğü olmadan kullanılabilir.