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
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 goto
s: 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
Nasıl git işareti silinmiş ve dosya bi...
Nasıl olaylar olmadan fare konumu (far...
Satır/bölge yukarı ve aşağı hareket em...
Hareket eden birden fazla Team Foundat...
Neden = listeler beklenmedik bir harek...