cubeide aynı değişken birden fazla tanımlamasına hata vermiyor

Başlatan magnetron, 23 Haziran 2021, 15:03:47

magnetron

merhaba forum,

yanlışlıkla 2 ayrı c dosyasında aynı değişkeni tanımlamışım

cubeide buna uyarı vermesini nasıl sağlarım

teşekkür

Tagli

Bir değişken aynı isimle birden fazla dosyada tanımlanırsa derleyici değil ama linker sana hata verir. Benim aklımda öyle kalmış ama yanılıyor olabilirim.

Eğer bir .c dosyası içinde, sadece o dosyada kullanılacak global değişkenlerin varsa - ki buradaki global kelimesi biraz yanıltıcı çünkü bu değişkenler proje genelinde kullanılmayacak - bu değişkenleri static olarak tanımlamalısın. Bu şekilde tanımlanmış değişkenlerin internal linkage'a sahip oldukları söylenir ve linker'a görünmez olurlar.

C++'ta kod yazarken, yukarıda anlattığım yöntem işe yarasa da tercih edilmez. Burada genelde bu tür değişkenler isimsiz bir namespace ile sarmalanarak linker'a görünmez kılınırlar.

Aklımda yanlış kalmadıysa, const veya constexpr olarak tanımlanmış global değişkenler, başlarında static yazmasa bile varsayılan olarak internal linkage'a sahip olurlar ve linker'a gözükmezler.
Gökçe Tağlıoğlu

magnetron

hocam bende şu şekilde

CubeIDE' de bir C dili projesinde

x.c dosyasında global olarak    uint8_t ik   değişkeni tanımlanmış

y.c dosyasında da farkına varmadan global    uint8_t ik         değişkeni tanımlanmış

buna hata vermiyor  vermesi gerekmez mi

Tagli

Emin değilim ama bence linker hata vermeliydi. Burada benzer bir soru var ve soran kişi de hata almadığını ama iki dosyanın da ortak bir değişkene okuma yazma yaptığını söylemiş.

Özetle, bu tür değişkenleri static olarak tanımlamayı alışkanlık haline getirmek lazım.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: magnetron - 23 Haziran 2021, 15:03:47merhaba forum,

yanlışlıkla 2 ayrı c dosyasında aynı değişkeni tanımlamışım

cubeide buna uyarı vermesini nasıl sağlarım

teşekkür

Burada uyarı değil hata vermesi lazım:) Uyarı bile vermemesi ilginç. Hangi derleyici kullanılıyor?

magnetron

Alıntı yapılan: mr.engineer - 23 Haziran 2021, 18:35:34Burada uyarı değil hata vermesi lazım:) Uyarı bile vermemesi ilginç. Hangi derleyici kullanılıyor?

CubeIDE gcc hocam

magnetron

hocam şöyle yapmaya karar verdim

bütün global değişkenleri bir header dosya içine yazdım

bu header dosyayı da ilgili .c dosyalarında include ettim

bu sefer de header dosyayı bir kaç kere eklemiş oluyor ve hata veriyor

bunu nasıl yapıcam da bu dosyayı projenin tamamında bir kere işlesin

teşekkür




mr.engineer

Hocam paylaşmak istediğiniz değişkenleri bir .c dosyasında global tanımlayın. Daha sonra bir .h dosyasında bu değişkenleri extern olarak bildirin. Diğer .c dosyalarına .h uzantılı dosyayı include edin. Tüm eklediğiniz dosyalarda bu değişkenleri kullanabilirsiniz.

//deneme.c
int a;
double x,y;


//deneme.h
extern int a;
extern double x,y;

Tagli

Projede bir alt modülü temsil eden modul.c dosyan olduğunu varsayalım.

O modüle özgü global değişkenleri modul.c içinde static olarak tanımla. Bunlar dışarıdaki aynı isimdeki değişkenlerle karışmazlar.

Tüm proje tarafından erişilmesi gereken değişkenleri modul.c içinde normal tanımla. modul.h içine ise başına extern koyarak - ama değer ataması yapmadan - yerleştir. Ancak genel olarak bu tür global değişkenlerin iyi bir tasarım yöntemi olmadığını, ve bunlara fonksiyonlar ile erişmenin daha güvenli olacağını aklında bulundur. Yine de bazen gerekiyorlar, benim de bu şekilde kullandığım oluyor.

Modüle özgü, dışarısı tarafından kullanılmayacak fonksiyonların prototiplerini module.c başına yerleştir. Fonksiyonların gövdelerini module.c içinde istediğin yerde tanımla. Hem fonksiyon gövdelerinin, hem de prototiplerin başına static ekle.

Dışarıdan erişilmesi gereken arayüz fonksiyonlarının prototiplerini module.h içine koy. Fonksiyonların gövdelerini yine modul.c içinde tanımlaman gerek. Fonksiyonları modul_fonksiyon() şeklinde isimlendirmen uygun olacaktır, böylece başka modüllerdeki benzer isimli fonksiyonlarla karışmazlar. Bu fonksiyonlar arasında çok kısa 1-2 satırlık olanlar varsa, bunların gövdelerini doğrudan module.h içine koyabilirsin. Bu fonksiyonların başına inline eklemen gerekir. Ayrıca bir prototip yazmana gerek olmaz. Bu şekilde yaparsan, derleyicinin bunları optimize etmesi kolaylaşır.

Header dosyasında mutlaka Header Guard olsun. Bahsetmiş olduğun hatayı büyük ihtimalle bu yüzden alıyorsun.
Gökçe Tağlıoğlu

tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

magnetron

hocam bütün global değişkenleri xx.h dosyasında topladım include guard yaptım gene hata veriyordu

ST nin forumunda sordum kırk yıl düşünsem aklıma gelmez

int8_t ikl=1; şeklinde başlangıç değeri vermeme itiraz ediyormuş

bence bunu düzeltmeleri lazım  gcc' de



Tagli

Global değişkenlere başlangıç değeri vermende bir sakınca yok. Ama bunu .c dosyasında yapman gerekir. .h dosyasında extern'li ifadede başlangıç değeri veremezsin. GCC'de standart dışı bir durum olmaz kolay kolay. GCC izin vermiyorsa, C standartında o işlem yasak demektir zaten.
Gökçe Tağlıoğlu

RaMu

Alıntı yapılan: magnetron - 25 Haziran 2021, 14:43:42...hata veriyordu

ST nin forumunda sordum kırk yıl düşünsem aklıma gelmez
...



Yazılanları gözden kaçırmasan yeter kırk yıl düşünmeye gerek yok.

Alıntı yapılan: Tagli - 23 Haziran 2021, 20:46:58...

Tüm proje tarafından erişilmesi gereken değişkenleri modul.c içinde normal tanımla. modul.h içine ise başına extern koyarak - ama değer ataması yapmadan - yerleştir. Ancak ...
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html