SORU
21 EYLÜL 2008, Pazar


Kullanmalıyım #define, numaralama ya da sabit mi?

C bir proje üzerinde çalışıyorum, bir ben varbayrakdört değer olan değer. Bu dört bayrakları birleştirilebilir. Bayraklar veritabanı kayıtlarında tarif edilebilir:

  • yeni kayıt
  • kaydı silinmiş
  • kayıt değiştirilmiş
  • kaydı mevcut

Şimdi, bu öznitelik kalmasını istediğim her kayıt için bir numaralama kullanabilirim:

enum { xNew, xDeleted, xModified, xExisting }

Ancak, kodu başka yerlerde, tek bir parametre olarak geçmek mümkün gibi olmak istiyorum yani kullanıcı için görünür olması için, hangi seçmek için ihtiyacım var:

showRecords(xNew | xDeleted);

Yani, üç olası yönelişleri var gibi görünüyor:

#define X_NEW      0x01
#define X_DELETED  0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08

ya

typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;

ya

namespace RecordType {
    static const uint8 xNew = 1;
    static const uint8 xDeleted = 2;
    static const uint8 xModified = 4;
    static const uint8 xExisting = 8;
}

Alan gereksinimleri önemli (vs int bayt) ama çok önemlidir. enum tipi emniyet kaybederim tanımlar, ve ben biraz boşluk (tamsayılar) kaybetmek ve muhtemelen bir bit işlemi yapmak istiyorum ne zaman dökme. Rastgele beri const aynı zamanda tür güvenliği kaybetmek bence uint8 yanlışlıkla.

Başka temiz bir yolu var mı?

Ve neden ne kullanacaksın?

#defines, ve birkaç mekanlarda ad ve şablonları kullandım, bu sorun değil mi yani olmadan P. S. kodu geri kalanı oldukça temiz C ya da modern.

CEVAP
22 EYLÜL 2008, PAZARTESİ


Stratejileri tek bir yaklaşımın dezavantajları azaltmak için birleştirir. Aşağıdaki çözüm tamsayı ve bit operatörleri flash kullanımı hızlı, düşük bellek ve düşük olduğu gerçeğine dayanmaktadır çok gömülü sistemler üzerine çalışıyorum.

Genel ad kirletici sabitler önlemek için bir ad numaralama yer.

namespace RecordType {

Bir numaralama derleme bir yazılı kontrol eder ve tanımlar. Her zaman tür bağımsız değişkenleri ve Değişkenler doğru türde verilir emin olmak için kontrol derleme kullanın. C typedef gerek yok .

enum TRecordType { xNew = 1, xDeleted = 2, xModified = 4, xExisting = 8,

Geçersiz bir devlet, başka bir üye oluşturmak. Bu hata kodu olarak yararlı olabilir; devlet, ama ben/iade etmek istediğinizde örneğin, Ç işlemi başarısız olur. Ayrıca hata ayıklama için kullanışlıdır; hazırlama listeler ve eğer bu değişkenin değeri kullanılmalıdır bilmek yıkıcılar.

xInvalid = 16 };

Bu tip iki amacı olduğunu düşünün. Bir kayıt mevcut durumu izlemek ve bazı eyaletlerde kayıtları seçmek için bir maske oluşturmak için. Eğer type değeri Amacınız için geçerli olup olmadığını test etmek için bir satır içi işlevi oluşturmak; devlet bir marker devlet bir maske vs. Bu typedef int gibi böcekleri yakalar ve 0xDEADBEEF gibi bir değer ya da mispointed ilklenmemiş değişken ile değişken olabilir.

inline bool IsValidState( TRecordType v) {
    switch(v) { case xNew: case xDeleted: case xModified: case xExisting: return true; }
    return false;
}

 inline bool IsValidMask( TRecordType v) {
    return v >= xNew  && v < xInvalid ;
}

Eğer sık sık kullanmak isterseniz using bir yönerge ekleyin.

using RecordType ::TRecordType ;

Kontrol işlevleri yararlı değeri kötü değerler kullanılır en kısa sürede yakalamak için iddia. Hızlı çalışan bir böcek yakalamak, daha az hasar yapabilir.

Burada hepsini bir araya koymak için bazı örnekler.

void showRecords(TRecordType mask) {
    assert(RecordType::IsValidMask(mask));
    // do stuff;
}

void wombleRecord(TRecord rec, TRecordType state) {
    assert(RecordType::IsValidState(state));
    if (RecordType ::xNew) {
    // ...
} in runtime

TRecordType updateRecord(TRecord rec, TRecordType newstate) {
    assert(RecordType::IsValidState(newstate));
    //...
    if (! access_was_successful) return RecordType ::xInvalid;
    return newstate;
}

Doğru değer güvenliğini sağlamak için tek yol işleç aşırı özel bir sınıf kullanmak ve başka bir okuyucu için bir alıştırma olarak bırakılmıştır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007