← man/dev_and_programming
unifdefall — man unifdefall — 80×24
ugur@toprak:~/man/dev_and_programming$man unifdefall
Bölüm 1 Geliştirme & Programlama

unifdefall

önişlemci koşullularını koddan kaldırır

Sinopsis

     unifdef [-bBcdehKkmnsStV] [-Iyol] [-[i]Dmakro[=değer]] [-[i]Umakro] ... [-f tanım_dosyası] [-x {012}]
	     [-M yedek_uzantısı] [-o çıktı_dosyası] [girdi_dosyası ...]
     unifdefall [-Iyol] ... dosya

Açıklama

unifdef aracı, koşullu cpp(1) yönergelerini seçici olarak işler. Bir dosyadan hem yönergeleri hem de kaldırılması gerektiğini belirttikleri ek metinleri kaldırırken, dosyanın geri kalanını olduğu gibi bırakır.

unifdef aracı, -D ve -U komut satırı seçeneklerinde veya -f tanım dosyalarında belirtilen makroları kullanarak #if, #ifdef, #ifndef, #elif, #else ve #endif satırları üzerinde işlem yapar. Makro belirtimleri, kontrol ifadesi için kesin bir değer sağlamaya yetiyorsa yönerge işlenir. Sonuç yanlış (false) ise, yönerge ve onun kontrolü altındaki sonraki satırlar kaldırılır. Sonuç doğru (true) ise, yalnızca yönerge kaldırılır. Kontrol makrosu belirtilmemişse, bir #ifdef veya #ifndef yönergesi değiştirilmeden aynen aktarılır. Bilinmeyen bir değere sahip olan veya unifdef'in ayrıştıramadığı herhangi bir #if veya #elif kontrol ifadesi değiştirilmeden aktarılır. Varsayılan olarak unifdef, sabit ifadeler içeren #if ve #elif satırlarını yoksayar; komut satırında -k bayrağı belirtilerek bunları işlemesi söylenebilir.

#if ve #elif satırları için ifade sözdiziminin yaygın olarak kullanılan bir alt kümesini anlar: tamsayı sabitleri, komut satırında tanımlanan makroların tamsayı değerleri, defined() operatörü, !, ~, - (tekli), *, /, %, +, -, <, <=, >, >=, ==, !=, &, ^, |, &&, || operatörleri ve parantez içindeki ifadeler. Sıfıra bölme bilinmeyen bir değer olarak kabul edilir. && operatörü için bir tür “kısa devre” değerlendirmesi kullanılır: işlenenlerden biri kesinlikle yanlış ise, diğer işlenenin değeri bilinmiyor olsa bile sonuç yanlıştır. Benzer şekilde, || operatörünün işlenenlerinden biri kesinlikle doğru ise sonuç doğrudur.

Bir ifadeyi değerlendirirken, unifdef önce makroları genişletmez. Bir makronun değeri bir ifade değil, basit bir sayı olmalıdır. Bir makronun değerinin bir diğerinin adı olduğu sınırlı bir dolaylı yönlendirme biçimine izin verilir.

Çoğu durumda unifdef, nesne benzeri makrolar (argümansız) ile fonksiyon benzeri makrolar (argümanlı) arasında ayrım yapmaz. #if ve #elif kontrol ifadelerinde fonksiyon benzeri bir makro çağrısı görünebilir. Makro açıkça tanımlanmamışsa veya komut satırdaki -D bayrağıyla ya da bir -f tanım dosyasındaki #define ile tanımlanmışsa, argümanları yoksayılır. Bir makro komut satırındaki -U bayrağıyla veya bir -f tanım dosyasındaki #undef ile açıkça tanımsız hale getirilmişse, bu durum bir sözdizimi hatasına yol açacağından hiçbir argümana sahip olamaz.

unifdef aracı, yönergelerden birinin bir yorum içinde olduğu için etkin olmadığını veya ters eğik çizgiyle devam eden bir satırla bölündüğü için değerlendirilemeyeceğini bilecek kadar C dilinden anlar. Sıra dışı biçimlendirilmiş önişlemci yönergelerini tespit eder ve düzen kendisinin işleyemeyeceği kadar tuhaf olduğunda bunları değiştirmeden aktarılır. (Aşağıdaki HATALAR bölümüne bakın.)

Bir dosyadan tüm koşullu cpp(1) yönergelerini kaldırmak için unifdefall adlı bir betik kullanılabilir. Tüm kontrol makrolarının ve tanımlarının (veya tanımlanmamışlıklarının) listelerini almak için unifdef -s ve cpp -dM komutlarını kullanır, ardından dosyayı işlemek için uygun argümanlarla unifdef'i çağırır.

Seçenekler

-Dmakro=değer Bir makronun verilen bir değere tanımlandığını belirtir.

  • -Dmakro: Bir makronun 1 değerine tanımlandığını belirtir.

  • -Umakro: Bir makronun tanımsız olduğunu belirtir.

Aynı makro birden fazla argümanda görünürse, son görünüm geçerli olur.

-iDmakro[=değer]

  • -iUmakro: Bu seçeneklerle belirtilen makrolar tarafından kontrol edilen #ifdef ve #ifndef blokları içinde C dizeleri, yorumlar ve satır devamlılıkları yoksayılır.

-f tanım_dosyası tanım_dosyası dosyası, ilgili -D ve -U komut satırı argümanlarıyla aynı etkiye sahip olan #define ve #undef önişlemci yönergelerini içerir. Birden fazla -f argümanına sahip olabilir ve bunları -D ve -U argümanlarıyla karıştırabilirsiniz; sonraki seçenekler öncekileri geçersiz kılar.

Her yönerge tek bir satırda olmalıdır. Nesne benzeri makro tanımları (argümansız) verilen değere ayarlanır. Fonksiyon benzeri makro tanımları (argümanlı) 1'e ayarlanmış gibi işlem görür.

Uyarı: Dize sabitleri ve karakter sabitleri -f dosyalarında doğru şekilde ayrıştırılmaz.

  • -b: Kaldırılan satırları silmek yerine boş satırlarla değiştirir. -B seçeneği ile karşılıklı olarak dışlayıcıdır.

  • -B: Silinen bir bölümün etrafındaki boş satırları sıkıştırır. -b seçeneği ile karşılıklı olarak dışlayıcıdır.

  • -c: Tümleyen, yani kaldırılacak veya boş bırakılacak satırlar korunur ve tersi yapılır.

  • -d: Hata ayıklama mesajlarının yazdırılmasını etkinleştirir.

  • -e: Varsayılan olarak unifdef, birden fazla satıra yayılan bir önişlemci yönergesini kaldırması gerekiyorsa (örneğin, sağ ucunda çok satırlı bir yorum asılıysa) bir hata bildirir. -e bayrağı bunun yerine satırı yoksaymasını sağlar.

  • -h: Yardımı yazdırır.

  • -Iyol: unifdefall betiğine #include dosyalarının aranacağı ek bir yer belirtir. Bu seçenek, cpp(1) ile uyumluluk sağlamak ve unifdefall uygulamasını basitleştirmek için unifdef tarafından yoksayılır.

  • -K: Bilinmeyen işlenenlerin sonucu etkileyemediği durumlarda kısa devre yapmak yerine, işlenenlerden biri bilinmiyorsa && ve || operatörlerinin sonucunu her zaman bilinmeyen olarak kabul eder. Bu seçenek unifdef'in eski sürümleriyle uyumluluk içindir.

  • -k: Sabit ifadeler içeren #if ve #elif satırlarını işler. Varsayılan olarak, bu tür satırlar tarafından kontrol edilen bölümler değiştirilmeden aktarılır çünkü genellikle “#if 0” ile başlarlar ve gelecekteki veya geçmişteki geliştirmeleri taslak haline getirmek için bir tür yorum olarak kullanılırlar. Normal yorumlarda olduğu gibi bunları da söküp atmak kaba bir davranış olurdu.

  • -m: Bir veya daha fazla girdi dosyasını yerinde değiştirir. Bir girdi dosyası değiştirilmezse, orijinal dosya özdeş bir kopyayla üzerine yazılmak yerine korunur.

-M yedek_uzantısı Girdi dosyalarını yerinde değiştirir ve girdi dosya adlarının sonuna yedek_uzantısı ekleyerek orijinal dosyaların yedeklerini tutar. Sıfır uzunluğundaki bir yedek_uzantısı, -m seçeneyle aynı şekilde davranır.

  • -n: Silinen herhangi bir satırın ardından çıktıya #line yönergeleri ekler, böylece çıktı dosyası derlenirken üretilen hatalar girdi dosyasındaki satır numaralarına karşılık gelir.

-o çıktı_dosyası Tek bir dosyayı işlerken çıktıyı standart çıktı yerine çıktı_dosyası dosyasına yazar.

  • -s: Bir girdi dosyasını her zamanki gibi işlemek yerine, bu seçenek unifdef'in önişlemci yönergesi kontrol ifadelerinde kullanılan makroların bir listesini üretmesine neden olur.

  • -S: -s seçeneği gibidir, ancak her makronun iç içe geçme derinliği de yazdırılır. Bu, birbirine bağımlı tanımlanmış/tanımlanmamış makroların olası kombinasyonlarının sayısını hesaplamak için kullanışlıdır.

  • -t: C dizeleri, yorumlar ve satır devamlılıkları için ayrıştırmayı devre dışı bırakır; bu, düz metinler için kullanışlıdır. Bu, -iD ve -iU bayraklarının genel bir sürümüdür.

  • -V: Sürüm ayrıntılarını yazdırır.

-x {012} Çıkış durumu modunu sıfır, bir veya iki olarak ayarlar. Ayrıntılar için aşağıdaki ÇIKIŞ DURUMU bölümüne bakın.

unifdef aracı, dosya argümanı yoksa girdisini standart girdiden (stdin) alır. Birden fazla girdi dosyası varsa -m veya -M seçeneklerini kullanmalısınız. Standart girdiden girdi veya standart çıktıya çıktıyı ‘-’ ile belirtebilirsiniz.

unifdef aracı, diff(1) programının -Dmakro seçeneğiyle oldukça uyumlu çalışır.

Çıkış Durumu

Normal kullanımda unifdef aracının çıkış durumu, -x seçeneği kullanılarak ayarlanan moda bağlıdır.

Çıkış modu sıfır (varsayılan) ise, çıktı girdinin tam bir kopyasıysa unifdef 0 durumuyla, çıktı farklıysa 1 durumuyla çıkar.

Çıkış modu bir ise, çıktı değiştirilmemişse unifdef 1 durumuyla, farklıysa 0 durumuyla çıkar.

Çıkış modu iki ise, unifdef her iki durumda da sıfır durumuyla çıkar.

Tüm çıkış modlarında, bir hata varsa unifdef 2 durumuyla çıkar.

-h veya -V komut satırı seçenekleri verilirse çıkış durumu 0 olur.

Teşhis

EOF in comment (Yorum içinde dosya sonu)

Inappropriate #elif, #else or #endif (Uygunsuz #elif, #else veya #endif)

Missing macro name in #define or #undef (#define veya #undef içinde eksik makro adı)

Obfuscated preprocessor control line (Belirsizleştirilmiş önişlemci kontrol satırı)

Premature EOF (Erken dosya sonu - en son sonlandırılmamış #if satır numarasıyla birlikte)

Too many levels of nesting (Çok fazla iç içe geçme seviyesi)

Unrecognized preprocessor directive (Tanımlanamayan önişlemci yönergesi)

Unterminated char or string literal (Sonlandırılmamış karakter veya dize sabiti)

Ayrıca Bakınız

cpp(1), diff(1)

unifdef ana sayfası: http://dotat.at/prog/unifdef

Geçmiş

unifdef komutu 2.9BSD'de ortaya çıktı. ANSI C desteği FreeBSD 4.7'de eklendi.

Yazarlar

Orijinal uygulama Dave Yost Dave@Yost.com tarafından yazılmıştır. Tony Finch dot@dotat.at, ANSI C'yi desteklemek için onu yeniden yazmıştır.

Hatalar

• İfade değerlendirmesi oldukça sınırlıdır.

• Karakter sabitleri değerlendirilmez. -f tanım dosyalarındaki dize sabitleri ve karakter sabitleri, bir makronun değiştirme belirteçlerinin bir parçası olarak ayrıştırılmak yerine yoksayılır.

• C++ ham dize sabitlerinin (raw string literals) yalnızca temel biçimi tanınır; R"delimiter(dize)delimiter" biçimindeki gibi sınırlayıcılar olmadan R"(dize)" gibi.

• Kaynak dosyalar tek seferde bir satır olarak işlenir, bu nedenle (yorumlar veya ters eğik çizgi-yeni satır nedeniyle) birden fazla fiziksel satıra bölünmüş önişlemci yönergeleri her durumda işlenemez.

• Üçlü harfler (trigraphs) tanınmaz.

• Kaynak dosyanın farklı noktalarında farklı tanımlara sahip makrolar için destek yoktur.

• Metin modu ve yoksayma işlevi, modern cpp(1) davranışıyla uyuşmamaktadır.

Lütfen hata raporlarını dot@dotat.at adresine e-posta ile gönderin.

macOS 26.4 December 3, 2015 macOS 26.4