SORU
6 EKİM 2013, Pazar


Neden C ön işlemci word "linux" sürekli " olarak yorumlamak;1"?

Neden C ön işlemci GCC kelime linux (küçük harf) yorumlamak gibi sabit 1 mu?

test.c:

#include <stdio.h>
int main(void)
{       
    int linux = 5;
    return 0;
}

Sonuç $ gcc -E test.c (önişleme aşamasından sonra durdurma):

....
int main(void)
{
    int 1 = 5;
    return 0;
}

-Elbette - bir hata verir.

(BTW: istasyonu. #define linux yok.h dosyası.)

CEVAP
6 EKİM 2013, Pazar


Eski Günlerde (pre-ANSI), unix vax gibi predefining semboller kodu için derlenmiş olmanın ne olduğunu derleme zamanında tespit etmesi için bir yoldu. Ortada resmi dil standart zamanlar (ötesinde referans malzeme arka ilk baskısı K&R) ve C kodu herhangi bir karmaşıklık oldu genellikle karmaşık bir labirent #ifdefs izin için farklılıklarını sistemleri. Bu makro tanımları genellikle kütüphane başlık dosyasında derleyici kendisi, tanımlanmamış tarafından kuruldu. Beri orada hiçbir gerçek kuralları ile ilgili olan tanımlayıcı olabilir tarafından kullanılan uygulama ve hangi edildi rezerve için programcılar, derleyici yazarların hissettim ücretsiz kullanımı basit isimler gibi unix ve kabul programcılar ki sadece kullanmaktan kaçının bu isimleri kendi amaçları.

1989 ANSI C standart kuralları uygulaması, önceden tanımlanmış yasal olarak ne kısıtlama getirmiştir. Bir makro önceden tanımlanmış derleyici tarafından tek bir isim ile başlayan iki çizgi veya bir alt çizgi ve ardından bir büyük harf, terk programcılar için ücretsiz kullanım tanımlayıcıları eşleşen bir desen ve kullanılan standart kütüphane.

Sonuç olarak, unix linux önceden belirler herhangi bir derleyici mükemmel int linux = 5; gibi bir şey kullanan yasal kodu derlemek için başarısız olur beri olmayan uygun.

Böyle olduğundan, gcc olmayan uygun varsayılan olarak -- ama uygun yapılan (oldukça iyi) doğru komut satırı seçenekleri ile olabilir

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic

Daha fazla ayrıntı için the gcc manual bkz.

gcc onlara bağımlı kod yazmanız gerekmez mi yani gelecek sürümlerde bu tanımlar aşamalı olacak. Eğer program bilmesine gerek olmadığını bu şekilde derlenmiş bir Linux hedef ya da değil olabilir olup olmadığını kontrol edin __linux__ tanımlanmış (varsayıyorsun kullanarak veya bir gcc derleyici bu uyumlu ile). Daha fazla bilgi için the GNU C preprocessor manual bkz.

Bir büyük ölçüde ilgisiz bir kenara: "İyi Bir Liner" kazanan 1987 International Obfuscated C Code Contest ile David Korn (Evet, yazarın Korn Shell) aldı avantajı, önceden tanımlanmış unix makro:

main() { printf(&unix["\021%six\012\0"],(unix)["have"] "fun"-0x60);}

"unix" ama makro imlası ile hiçbir ilgisi olmayan nedenlerle yazdırır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • calicoJake

    calicoJake

    29 EKİM 2007
  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010