SORU
24 EYLÜL 2009, PERŞEMBE


C varsayılan bağımsız değişkenleri

Bir şekilde C bir işlev için varsayılan bağımsız değişkenleri belirtin var mı?

CEVAP
28 Mayıs 2010, Cuma


Vay herkes burada bu kadar karamsar. Cevap evet.

Önemsiz değil: sonuna kadar, temel işlevi, destekleyen bir yapı, sarıcı fonksiyon ve makro zorundayız sarıcı işlevi. Tüm bu otomatikleştirme makrolar kümesi var işim; bir kez sen de aynı şeyi yapmak kolay gelir akışını anlamak.

Burada detaylı bir dış bağlantı özeti burada tamamlayacak yüzden başka bir yerde bu kadar yazdım: http://modelingwithdata.org/arch/00000022.htm

Açmak istiyoruz

double f(int i, double x)

varsayılan alan bir fonksiyon içine (i=8, x=3.14). Bir arkadaş yapı tanımlayın:

typedef struct {
    int i;
    double x;
} f_args;

Yeniden Adlandır işlevi, 7* *ve varsayılanları ve görüşmeleri ayarlayan kapsayıcı bir işlev tanımlayın üs:

double var_f(f_args in){
    int i_out = in.i ? in.i : 8;
    double x_out = in.x ? in.x : 3.14;
    return f_base(i_out, x_out);
}

Şimdi eklemek bir makro, C variadic macros kullanarak. Bu şekilde kullanıcılar, onlar bilmek zorunda değil aslında f_args bir yapı yerleştirmek ve her zamanki yaptığınızı düşünüyorum:

#define f(...) var_f((f_args){__VA_ARGS__});

TAMAM, şimdi tüm aşağıdaki çalışır:

f(3, 8);      //i=3, x=8
f(.i=1, 2.3); //i=1, x=2.3
f(2);         //i=2, x=3.14
f(.x=9.2);    //i=8, x=9.2

Nasıl bileşik kesin kurallar için varsayılanları kuralları kontrol edin.

İşe yaramaz bir şey: eksik bir değeri ayırt edemeyiz çünkü f(0) ve sıfır. Benim durumumda, bu noktaya dikkat etmek bir şeydir, ama bakım olarak alınabilir ---yarım doğar varsayılan gerçekten sıfırdır.

Bağımsız ve varsayılanları adlı çünkü bence bunu yazmakla sorun yaşadım gerçekten C kodlama daha kolay ve daha eğlenceli. Ve C bu kadar basit olmak için harika olduğunu ve hala yeterince tüm bu mümkün yapmak zorunda.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • captainpuppys2000

    captainpuppy

    20 HAZİRAN 2013
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007