SORU
30 EKİM 2010, CUMARTESİ


C C hareket

Birkaç yıl C kodlama sonra , yakın zamanda bir iş gömülü alanda C kodlama, teklif edildi.

Doğru ya da yanlış gömülü alanda C kapatmak için var olup olmadığı sorusunu bir kenara bırakırsak, C çok özlerim bazı özellikler/cümleler var. Sadece birkaç isim için:

  • Genel, tip-güvenli veri yapıları (şablonları kullanarak).
  • DEMİRYOLU. Özellikle birden çok dönüş fonksiyonlarda puan, örneğin hatırlamak zorunda değil her dönüş noktasında seslerini.
  • Genel olarak yıkıcı. I. e. d bir'tor bir kere Sınıfım yazıyorsun, sonra Sınıfım örneği MyOtherClass üyesi ise, MyOtherClass açıkça Sınıfım örneği deinitialize gerek yok - ge'tor otomatik olarak adlandırılır.
  • Ad.

Deneyimlerinizi C C hareket nedir?
Ne C yerine C En sevdiğim özellik için/cümleler buldun mu? C olsaydı herhangi bir C özellikleri fark ettiniz?

CEVAP
30 EKİM 2010, CUMARTESİ


Gömülü bir proje üzerinde çalışırken, tüm C bir kez çalıştı, ve sadece buna katlanamıyordu. Zor bir şey okumak için çok ayrıntılı oldu. Ayrıca, daha az güvenli ve #define düzeltmek için daha zor engeller haline vardı yazmıştım optimize-için-gömülü konteynırlar, hoşuma gitti.

C benzeyen kodu:

if(uart[0]->Send(pktQueue.Top(), sizeof(Packet)))
    pktQueue.Dequeue(1);

dönüşür:

if(UART_uchar_SendBlock(uart[0], Queue_Packet_Top(pktQueue), sizeof(Packet)))
    Queue_Packet_Dequeue(pktQueue, 1);

birçok kişi muhtemelen iyidir ama "yöntem" bir çizgi çağırır. bir kaç saatten daha fazla varsa saçma olur diyecek olan C iki satır C (80-char satır uzunluğu sınırları nedeniyle) beş dönüşecekti. Her iki hedef işlemci umurunda değil yani aynı kodu oluşturur!

Bir kez (1995 arkada), çok işlemcili bir veri işleme programı için C çok yazmaya çalıştım. Her işlemci kendi belleğine sahip olduğu türden bir program. Satıcı tarafından sağlanan derleyici bir C compiler (bir çeşit HighC türev), kütüphane kapalı kaynak edemedim GCC kullanmak için oluşturmak ve kendi API edildi tasarlanmış zihniyet bu programlar olurdu başta olmak başlatma/işlem/Sonlandır çeşitlilik, ınter-işlemci iletişim ilkel, en iyi ihtimalle.

C kullanabilirim o yüzden vazgeçtim, cfront, bir kopyasını buldum ve makefiles içine sızmış önce yaklaşık bir ay var . Cfront bile şablonlar destek vermedi, ama C kodu çok daha açıktı.

Genel, tip-güvenli veri yapıları (şablonları kullanarak).

C sayılacak tek şablonlar gibi görünen bir sürü kod ile header dosyasına bildirmek için:

TYPE * Queue_##TYPE##_Top(Queue_##TYPE##* const this)
{ /* ... */ }

birşeyi çekmek gibi:

#define TYPE Packet
#include "Queue.h"
#undef TYPE

Bu typedef ilk yaptığınız sürece bileşik türleri (unsigned char hiçbir kuyrukları gibi) için çalışmaz unutmayın.

Eğer bu kod aslında her yerde kullanılmaz eğer ... Oh, ve unutmayın, o zaman bile, sözdizimsel olarak doğru olup olmadığını bilmiyorsun.

DÜZENLEME:Bir şey daha: gerekirel ilekod örnekleme yönetmek. Eğer "kod değil." şablon varsa ^em>tümsatır içi işlevleri, sonra işler sizin bağlayıcı bir yığın dışarı tükürmek yok bu yüzden sadece bir kez örneği almak emin olmak için kontrol koymak gerekir "Foo birden çok örneğini" hataları.

Bunu yapmak için, bir "başlık bölümünde dosya: . uygulaması olmayan inlined şeyler koymak gerekecek

#ifdef implementation_##TYPE

/* Non-inlines, "static members", global definitions, etc. go here. */

#endif

Ve sonra, içindebirtüm kodunuzu yerleştirinbaşına şablonu varyantsenin için var:

#define TYPE Packet
#define implementation_Packet
#include "Queue.h"
#undef TYPE

Ayrıca, bu uygulama bölüm olması gerekiyordışarıda/#define/#endif 16**standart şablon içerebilir çünkü ayin, başka bir başlık dosyası başlık dosyası, ama daha sonra .c bir dosya oluşturmak gerekiyor.

Evet, çirkin hızlı olur. En C programcıları bile denemiyorsun ediliyor.

DEMİRYOLU.

Özellikle birden çok dönüş fonksiyonlarda puan, örneğin hatırlamak zorunda değil her dönüş noktasında seslerini.

Oldukça kodunuzu unutmayın ve tüm dönüş noktaları (fonksiyon sonu hariç) being gotos: alışması

TYPE * Queue_##TYPE##_Top(Queue_##TYPE##* const this)
{
    TYPE * result;
    Mutex_Lock(this->lock);
    if(this->head == this->tail)
    {
        result = 0;
        goto Queue_##TYPE##_Top_exit:;
    }

    /* Figure out `result` for real, then fall through to... */

Queue_##TYPE##_Top_exit:
    Mutex_Lock(this->lock);
    return result;
}

Genel olarak yıkıcı.

I. e. d bir'tor bir kere Sınıfım yazıyorsun, sonra Sınıfım örneği MyOtherClass üyesi ise, MyOtherClass açıkça Sınıfım örneği deinitialize gerek yok - ge'tor otomatik olarak adlandırılır.

Nesne inşaat açıkça aynı şekilde ele alınması gerekiyor.

Ad.

Aslında düzeltmek için basit bir şey: sadece taktik bir önek üzerinehersembol. Bu konuda daha önce derslere örtülü ad olduğu için) konuştuğum kaynak kabartmak birincil nedenidir. C millet bu yaşıyor, sonsuza kadar ve muhtemelen büyük bir anlaşma ne olduğunu görmek istemiyor.

YMMV

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ipsy

    ipsy

    1 EKİM 2012
  • Santozz Yazz

    Santozz Yazz

    23 Mart 2014
  • William Sledd

    William Sled

    24 EYLÜL 2006