SORU
5 Mayıs 2012, CUMARTESİ


Uyumsuz farkları(99) C ve C (11) aras?

Bu soru tarafından tetiklendiğini replie(s) post by Herb Sutter nereye diye açıkladı MS kararı için destek/C99 ama sadece bir derleyici ile C(99) özellikleri vardır C (11) standart zaten.

24**:

(...) C önemli ve dikkat en azından biraz hak ediyor.

Geçerli C orada varolan kod bir ÇOK şey var ama yok C geçerli . Kod yeniden yazılmış olması muhtemel değildir (...)

Beri ben sadece program MS C , gerçekten bilmiyorum "saf" C " şey, yani ben hazır resim ne bilgi C -dil kullanıyorum değildir C(99) ve ben küçük ipuçları bazı C99 kod işe yaramaz gibi-bir C derleyicisi.

restrict C99 tek kelime bana biliyorum unutmayıngörünüyorçok dar bir uygulama alanına sahip ve değişken uzunlukta diziler olan ne kadar geniş bir alanda ya da önemli olduğundan emin değilim ().

Ayrıca, herhangi bir önemli anlam farklılıkları vardır ya, o, o(99) C kodu frikiklerinden olmadığını çok merak ediyorumderleme(11) C ama altında C derleyici ile C derleyici ile farklı bir şeyler.


Hızlı bağlantılar cevaplar: Dış kaynaklar:

CEVAP
5 Mayıs 2012, CUMARTESİ


Yaş civarında (C90 veya daha önceki) için olan uyumsuzluklar bir grup olarak C99 ve C11 gerçekten güzel özellikleri bir sürü vardır. Bu off başım üstüne.

// Valid C
int *array = malloc(sizeof(*array) * n);

// Valid C and valid C  , extra typing, it's always extra typing...
int *array = (int *) malloc(sizeof(*array) * n);

// Valid C  
int *array = new int[n];

C99 güzel ve C programcıları her yerde kullanmak gerekir

C99'da yeni özellikler genel programlama için çok güzel. VLAs ve restrict değil (bence) ama çoğunlukla C FORTRAN ve sayısal programcılar restrict autovectorizer yardımcı olsa da) getirmek için genel kullanım için üretilen,. Beri uygun programı kullanan restrict hala işe tam olarak aynı şekilde (ama muhtemelen değil hızlı) #define restrict en üstünde dosya, o kadar önemli değil. VLAs vahşi doğada oldukça nadir gibi görünüyor.

Esnek dizi üyeleri güzel olabilir.Bu uzunlukta değişken diziler aynı DEĞİLDİR unutmayın! İnsanlar yıllardır bu numarayı kullanıyoruz, ama resmi destek daha az yazmak anlamına gelir ve bu da bize derleme zamanı sabitleri yapmanızı sağlar. (Eski yol büyüklükteki bir dizi 1, ama ayırma boyutunu hesaplama sonra oldu gerçek bir zahmet.)

struct lenstr {
    unsigned length;
    char data[];
};
// compile time constant
const struct lenstr hello = { 12, "hello, world" };

Belirlenmiş başlatıcılar.Kaydeder yazarak çok.

struct my_struct { int a; char *b; int c; const char *d; };
struct my_struct x = {
    .a = 15,
    .d = "hello"
    // implicitly sets b = NULL and c = 0
};
int hex_digits[256] = { ['0'] = 0, ['1'] = 1, ['2'] = 2, /* etc */ ['f'] = 15 };

inline anahtar kelimefarklı davranır, bu birim için bir işlev satır içi dış bir deklarasyon ekleyerek ilan olmayan satır içi bir sürümünü alır seçebilirsiniz.

Bileşik hazır.

struct point { float x; float y; };
struct point xy_from_polar(float r, float angle)
{
    return (struct point) { cosf(angle) * r, sinf(angle) * r };
}

snprintf işlevimuhtemelen benim top 10 en kullanışlı kütüphane fonksiyonları C. değil sadece eksik C , ama MSVC çalışma zamanı sağlar sadece bir fonksiyonu _snprintf olmayan garantili eklemek için bir NULL sonlandırıcı dize.(snprintf 11, ama hala bariz MSVC C çalışma zamanı yoktur.)

Anonim yapıları vesendikalar(C11, ama GCC uzantısı ezelden beri) (anonim sendikalar görünüşe göre C modunda C 03, MSVC desteği yok):

struct my_value {
    int type;
    union {
        int as_int;
        double as_double;
    }; // no field name!
};

Gördüğünüz gibi, birçok bu özellikleri sadece tasarruf bir sürü yazım (bileşik değişmez değerler), ya da yapmak daha kolay programlar için hata ayıklama (esnek dizi üyeleri), yapmak daha kolay önlemek için hata (belirlenmiş başlatıcılar / unutmak için başlatmak yapı alanları). Bu köklü değişiklikler değil.

Semantik farklılıklar, yumuşatma kuralları farklıdır eminim, ama çoğu derleyici bağışlayıcı yeterli bu gün bir test durumu göstermek için inşa edersin nasıl emin değilim. Herkes için ulaşır C ve C arasındaki fark C 1 Her zaman ama 32-bit C sisteminde genellikle 4 sizeof('a') eski bir deyim vardır. Ama kimse sizeof('a') neyse ne umurunda. Ancak mevcut uygulamalar kodlama ile bu C99 standardında bazı garantiler var.

Aşağıdaki kodu alın. Ekstra depolama kaybetmeden C tanımlama Birliği türleri için ortak bir hile kullanır. Bendüşünüyorumbu anlamsal C99 ve ben de geçerlidüşünüyorumbu anlamsal şüpheli C , ama yanılıyor olabilirim.

#define TAG_FUNKY_TOWN 5
struct object { int tag; };
struct funky_town { int tag; char *string; int i; };
void my_function(void)
{
    struct object *p = other_function();
    if (p->tag == TAG_FUNKY_TOWN) {
        struct funky_town *ft = (struct funky_town *) p;
        puts(ft->string);
    }
}

Ayıp ama.MSVC kod oluşturucu güzel, ön uç C99 yok hayır çok kötü.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howcast

    Howcast

    4 EKİM 2007
  • RickardRick

    RickardRick

    9 Mart 2007
  • tunez4you

    tunez4you

    20 EKİM 2008