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
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.
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
Emin değilim ama bence linker hata vermeliydi. Burada (https://stackoverflow.com/questions/7189982/two-variables-with-same-name-and-type-in-two-different-c-files-compile-with-g) 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.
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?
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
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
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;
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 (https://en.wikipedia.org/wiki/Include_guard) olsun. Bahsetmiş olduğun hatayı büyük ihtimalle bu yüzden alıyorsun.
Coşkun Taşdemir'in C ile modüler programlama serisini izlemenizi tavsiye ederim.
C ile modüler programlama 1 (https://www.youtube.com/watch?v=w6G3o3C-QVU&t=3s)
C ile modüler programlama 2 (https://www.youtube.com/watch?v=zZlYHKq8vmc)
C ile modüler programlama 3 (https://www.youtube.com/watch?v=KoYymuZSvlI)
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
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.
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 ...