Eski Günlerde (ANSI öncesi), unix
ve vax
gibi ön tanımlı semboller, kodun derleme sırasında hangi sistem için derlendiğini belirlemesine izin vermenin bir yoluydu. O zamanlar resmi bir dil standardı yoktu (K & R'nin ilk baskısının arkasındaki referans materyalin ötesindedir) ve herhangi bir karmaşıklığın C kodu, sistemler arasındaki farklılıklara izin vermek için tipik olarak karmaşık bir labirenttir (#ifdef
). Bu makro tanımları genellikle bir kütüphane başlık dosyasında tanımlanmayan derleyici tarafından belirlenir. Uygulama tarafından hangi tanımlayıcıların kullanılabileceği ve programcılar için ayrıldığı konusunda gerçek kurallar olmadığından, derleyici yazarlar unix
gibi basit isimleri kullanmakta özgürdüler ve programcıların bu isimleri kendi amaçları için kullanmaktan kaçındıklarını varsaydılar.
1989 ANSI C standardı, bir uygulamanın yasal olarak önceden tanımlayabildiği sembolleri sınırlayan kurallar getirmiştir. Derleyici tarafından önceden tanımlanmış bir makro yalnızca iki altçizgi ile başlayan bir isme sahip olabilir veya bir alt harfi ve ardından bir büyük harfle, programcıları bu örüntüyle eşleşmeyen ve standart kitaplıkta kullanılmayan tanımlayıcıları kullanmakta serbest bırakabilir. Bunun sonucunda
, bu
int linux = 5;
gibi bir şey kullanır tamamen yasal kodunu derlemek için başarısız olur, çünkü
unix
veya
linux
olmayan yere uyum olduğunu predefines herhangi derleyici.
O sırada da, gcc varsayılan olarak olmayan yere uyum olduğunu - ama doğru komut satırı seçenekleri ile (oldukça iyi) uymak için yapılabilir:
gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic
fazla ayrıntı için the gcc manual bakınız. Gc, bu tanımları gelecekteki sürümlerde aşamalı olarak kullanacaktır, bu nedenle bunlara bağlı kod yazmamalısınız. Programınızın bir Linux hedefi için derlenmiş olup olmadığını bilmesi gerekiyorsa veya __linux__
'un tanımlanmış olup olmadığını kontrol edebilir (gcc veya onunla uyumlu bir derleyici kullandığınızı varsayarak). Daha fazla bilgi için bkz. the GNU C preprocessor manual.
bir kenara büyük ölçüde ilgisiz:
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
It: David Korn tarafından 1987 International Obfuscated C Code Contest ait "İyi Bir Liner" kazanan, (evet, Korn Shell yazarı) makro önceden tanımlanmış unix
yararlandı "unix"
'u yazdırır, ancak makro isminin yazımıyla kesinlikle ilgisi olmayan nedenlerden dolayı. http://stackoverflow.com/:
bu/konu zaten şimdi – Letseatlunch
İlgili soru tarafından gelirdim almak sorular/3770322/is-unix-kısıtlanmış-anahtar kelime-in-c – matcheek
'#undef linux'unu denediniz mi, ya da belki farklı bir değişken kullanıyor muydunuz? Sanırım, işletim sistemi için test etmek için sabit olan "linux" kullanılır. çapraz platform uygulaması tasarlıyorsanız ve tam olarak hangi API'yi kullanacağınızı bilmeniz gerekiyorsa (windows, mac, linux, BSD, vb.). Bu stdio.h değil, ancak çekirdek linux ise hala tanımlanmıştır. Aynı kod, Windows'da bir hata üretmemeli, ancak Windows veya WINDOWS gibi bir değişkeni muhtemelen değişken olarak kullanacaktır ve tam tersi de –