From: Bulent Selek (bselek@best.com.tr)
Date: Wed 25 Feb 2004 - 04:24:49 EST
Murat, Bora yaptiginiz aciklamalar icin tesekkurler..
-----Original Message-----
From: linux-ileri-bounce@liste.linux.org.tr
[mailto:linux-ileri-bounce@liste.linux.org.tr]On Behalf Of Bora Şahin
Sent: Tuesday, February 24, 2004 11:50 PM
To: Bulent Selek
Subject: [linux-ileri] Re: printk mesajlari
SLmLar Bulent,
Monday, February 23, 2004, 10:06:02 PM, you wrote:
BS> #define printk(format, args...) ((0,##args), int(0))
Sanırım, #define printk(format, args...) ((0 , ##args), (int)0) olmalı...
^^^^^^
BS> kernel'da benzer ifadeleri s1k s1k gormeme ragmen anliyabilmis degilim,
BS> bu ne demektir ? :)
Yukarıdaki ifade tam olarak ne işe yarıyor yani "(int)0"dan farkını
anlayamadım(Sonuçta ikincisi de
herhangi bir ASM kodu üretmiyor. Tabii warning'leri kapatıyor olabilir,
bilemiycem) ama eğer
açılımını öğrenmek istiyorsan şöyle bir şey:
printk("Den\n") == ((0), (int)0)
printk("Den = %d\n", 25) == ((0, 25) (int)0)
gcc'ye -E switch'ini verirsen dosyanın derlenmeden önceki preprocess edilmiş
halini alabilirsin...
BS> belki anliyabilirim diye heveslendim ve soyle birsey yaptim
BS> #define printk (format, args...) ((0,##args), printf(format,args))
BS> #define printk2(format, args...) printf(format,args)
Yukarıdakiler hatalı. Şöyle olmalı:
#define printk (format, args...) ((0 , ##args), printf(format , ##args))
#define printk2(format, args...) printf(format , ##args)
BS> gcc ile derledim, ( bcc ezelden beri anlamiyor boyle seyleri )
bcc = Borland C Compiler'ı kast ediyorsan yukarıdaki özellik standart
değildi. Yani değişken sayıda
parametre alan makro yazmak C99 ile dile eklenmiş bir özelliktir.
Dolayısıyla 90'ların başında
yazılmış BCC'nin desteklemesi beklenemez. GCC ise uzun zamandır
destekliyordu. Zaten Linux'da
standart C'de olmayan, sadece GCC'ye özgü bir çok eklenti var.
BS> her iki deklerasyonda ayni kodu uretti. :(
Normal. Çünkü C'de virgül operatörü en sağdaki ifadenin değerini üretir.
Yani her iki durumda da
derleyici printf(format , ##args)'yi üretecektir...
BS> Birde vaktin varsa __attribute__ icin kisa bir aciklama yaparsan
sevinirim..
__attribute__ GCC'nin standart olmayan mimariye bağlı özelliklerini
ayarlamakta kullanılıyor. Yani
VC++'daki pragma gibi bir şey. Üç tip attribute var:
1) Fonksiyon
2) Değişken
3) Tür
Mesela örnek bir fonksiyon attribute'ü,
void func() __attribute__ ((noreturn));
Bu fonksiyon geri dönüş değeri döndürmüyor. Ya da calling convention'ları
ayarlayabilirsin, ...
gibi. Ayrıntılı bilgi için manual'e bakabilirsin...
Ayrıca printk() ve panic()'leri çekirdekten çıkaran bir yama görmüştüm bir
zamanlar. Onda da Murat
KOÇ'un yazdıklarına benzer şeyler vardı...
BS> Bulent
-- Bora Şahin borasahin.port5.com