Eski Günlerde (ANSI öncesi), unix
ve gibi sembolleri önceden tanımlamak vax
, kodun derlendiği zamanda hangi sistem için derlendiğini algılamasına izin vermenin bir yoluydu. O zamana kadar resmi bir dil standardı yoktu (K&R'nin ilk baskısının arkasındaki referans materyalin ötesinde) ve herhangi bir karmaşıklığın C kodu, #ifdef
sistemler arasında farklılıklara izin vermek için tipik olarak karmaşık bir s labirentiydi . Bu makro tanımları genellikle bir kütüphane başlık dosyasında tanımlanmayan derleyicinin kendisi tarafından ayarlanır. Uygulama tarafından hangi tanımlayıcıların kullanılabileceği ve programcılar için ayrılmış olan gerçek bir kural olmadığından, derleyici yazarları unix
, programcıların bu adları kendi amaçları için kullanmaktan kaçınacaklarını varsaydılar.
1989 ANSI C standardı, bir uygulamanın yasal olarak hangi sembolleri önceden tanımlayabileceğini kısıtlayan kurallar getirdi. Derleyici tarafından önceden tanımlanmış bir makro, yalnızca iki alt çizgi ile başlayan veya bir alt çizgi ile başlayan ve bir büyük harfle başlayan bir ada sahip olabilir;
Sonuç olarak, önceden tanımlayan unix
veya linux
uygun olmayan herhangi bir derleyici, bunun gibi bir şey kullanan mükemmel yasal kodu derleyemediğinden int linux = 5;
.
Olduğu gibi, gcc varsayılan olarak uygun değildir - ancak doğru komut satırı seçeneklerine uyması (oldukça iyi) yapılabilir:
gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic
Daha fazla ayrıntı için gcc kılavuzuna bakın.
gcc bu tanımları gelecekteki sürümlerde aşamalı olarak kaldıracaktır, bu nedenle onlara bağlı kod yazmamalısınız. Programınızın bir Linux hedefi için derlenip derlenmediğini bilmesi gerekiyorsa __linux__
, tanımlı olup olmadığını kontrol edebilir (gcc veya onunla uyumlu bir derleyici kullandığınız varsayılarak). Daha fazla bilgi için GNU C önişlemci kılavuzuna bakın.
Büyük ölçüde alakasız: 1987 Uluslararası Gizli C Kodu Yarışması'nın "En İyi Tek Liner" galibi, David Korn (evet, Korn Shell'in yazarı) önceden tanımlanmış unix
makrodan faydalandı :
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Yazdırır "unix"
, ancak makro adının yazımıyla hiçbir ilgisi olmayan nedenlerden dolayı.