2016-04-14 16 views
0

İki başlık dosyasında yaptığım özel bir tür kullanarak sorun yaşıyorum. Bir başlık dosyaları türü tanımlar, diğeri bir extern değişkeninde ve bir işlevi kullanır.İki başlık dosyasında özel bir tür kullanarak sorun. (C code)

"newfuncs.h" 

extern newtype_t c; 
newtype_t divide(double d, double e); 

alıyorum:

unknown type name 'newtype_t' //inside of "newfuncs.h" 

Bu yeni başlık "newfuncs.h" zaten bir ektir

"newtype.h" 

typedef struct { 
    double i, s; 
} newtype_t; 

newtype_t this(){} 
newtype_t that(){} 

Şimdi bir değişken ve fonksiyonu ile başka bir başlığa sahip Yeni türü ve "newtype.h" işlevlerini kullanan çalışma kodu. Bu newtype_t newfuncs.h dosyasının içinde kullanıyorum.

#include "newtype.h" yi denedim ancak .c dosyamda "çakışan türleri" içeren çok sayıda hata alıyorum.

+2

Muhtemelen kaçırmayın "newtype.h" dahil – Jakuje

+0

Hiçbir göremiyorum # # include's ... –

+0

Bilinmeyen tip adı, bildirilen satırda kendi türünün bildirilmediğini bildirir. "Newtype.h" dosyanız bu satırdan önce "newfuncs.h" dosyanızda yer alıyor mu? –

cevap

0

Bir başlık başka bir başlıkta bildirilen bir tür kullanırsa, içermelidir.

birden beyan sorunu önlemek için, başlık dosyalarında bir bekçi eklemek gerekir:

// file newtype.h 
#ifndef NEWTYPE_H // the guard 
#define NEWTYPE_H 

// all header stuff goes here 
typedef int my_type; 

#endif // end of guard 

Bunu yaparak, her tip veya işlev yalnızca bir kez belirlenecektir. Her koruma makrosu benzersiz olmalı, adını seçmek için dosya adını kullanabilirsiniz. #pragma once

+0

Ah HAH! Yanlış gittiğim yer burası. Muhafızları newtype.h'ye ilk eklediğimde, doğru formatı bilmiyordum. "Newtype.h" veya sadece newtype.h olduğunu sanıyordum, NEWTYPE_H (alt çizgi) olmalı. Zaman ayırdığın için teşekkürler!! – Funkypupster

+0

'NEWTYPE_H' yalnızca bir adlandırma kuralıdır. Geçerli bir tanımlayıcı olan herhangi bir şekilde adlandırılabilir.Eğer orijinal versiyonunuz #ifndef newtype.h' kullanıyorsa, problem periyottu. # # fndef FOO # #define FOO 'da çalışırdı. (Siz * NEWTYPE_H' kullanmalısınız *, ancak bu yalnızca her bir üstbilgiyle neyin jetonun ilişkilendirildiğini hatırlamanızı kolaylaştırdığından.) – Ray

0

doğru sırayla başlık dosyaları dahil yaptı: (cl) gibi

Bazı derleyici birden girilmesini önlemek için özel bir yorumunuz var?

Ben sadece test edilmiş ve çalışır

test.c

#include "newtype.h" 
#include "newfuncs.h" 
#include <stdio.h> 

int main(){ 
    double d = 4.0; 
    double e = 2.0; 
    c = divide(d, e); 
    printf("HELLO WORLD\n"); 
    printf("%lf", c.i); 
    printf("%lf", c.s); 
    return 0; 
} 

newtype_t divide(double d, double e){ 
    newtype_t x; 
    x.i = d; 
    x.s = e; 
    return x; 
} 

newtype.h

#ifndef NEWTYPE_H 
#define NEWTYPE_H 
typedef struct { 
    double i, s; 
} newtype_t; 

#endif 

newfuncs.h

#ifndef NEWFUNCS_H 
#define NEWFUNCS_H 
newtype_t c; 
newtype_t divide(double d, double e); 

#endif 

ancak bu bile tanımlamak olmadan Benim için çalışıyor (gcc 5.3.1).

İlgili konular