SORU
13 NİSAN 2014, Pazar


C kodu C 03 C ve 11 de geçerli ama farklı şeyler yapabilir miyiz?

C kodu C 03 standart ve C 11 standart hem de uygun, ama farklı şeyler derlenmiş ediliyor hangi koşullarda bağlı olarak yapmak mümkün müdür?

CEVAP
13 NİSAN 2014, Pazar


Cevabı kesin bir Evet. İşin iyi tarafı vardır:

  • Daha önce örtülü olarak kopyalanan nesneleri şimdi örtülü olarak mümkün olduğunda onları harekete geçirecek kodu.

Olumsuz tarafta, çeşitli örnekler standardın ek C listelenmiştir. Pozitif daha çok negatif olanlar var olsa da, her biri çok daha az olasıdır.

Dize hazır

#define u8 "abc"
const char* s = u8"def"; // Previously "abcdef", now "def"

ve

#define _x "there"
"hello "_x // Previously "hello there", now a user defined string literal

0 türü dönüştürme

C 11, sadece rakamları null işaretçi tamsayı sabitler

void f(void *); // #1
void f(...); // #2
template<int N> void g() {
    f(0*N); // Calls #2; used to call #1
}

Tamsayı bölme ve mod sonra yuvarlak sonuçları

C 03 derleyici ya da negatif sonsuza doğru 0 doğru veya yuvarlak izin verildi. C 11 0 doğru yuvarlamak için zorunludur

int i = (-1) / 2; // Might have been -1 in C  03, is now ensured to be 0

İç içe şablon arasındaki boşluklar kapanış parantez ^< . vs ^< .

İhtisas veya bir örnekleme içinde >> sağ shift C 03 olarak yorumlanabilir yerine. Bu mevcut kod olsa kırmak için daha olasıdır: (http://gustedt.wordpress.com/2013/12/15/a-disimprovement-observed-from-the-outside-right-angle-brackets/)

template< unsigned len > unsigned int fun(unsigned int x);
typedef unsigned int (*fun_t)(unsigned int);
template< fun_t f > unsigned int fon(unsigned int x);

void total(void) {
    // fon<fun<9> >(1) >> 2 in both standards
    unsigned int A = fon< fun< 9 > >(1) >>(2);
    // fon<fun<4> >(2) in C  03
    // Compile time error in C  11
    unsigned int B = fon< fun< 9 >>(1) > >(2);
}

Operatör new std::bad_alloc başka özel durum

struct foo { void *operator new(size_t x){ throw std::exception(); } }
try {
    foo *f = new foo();
catch (std::bad_alloc &) {
    // c  03 code
} catch (std::exception &) {
    // c  11 code
}

Kullanıcı-ilan yıkıcılar örtülü özel bir şartname var What breaking changes are introduced in C 11? örnek

struct A {
    ~A() { throw "foo"; } // Calls std::terminate in C  11
};
//...
try { 
    A a; 
} catch(...) { 
    // C  03 will catch the exception
} 

Konteyner size() şimdi O(1) çalıştırmak için gereklidir

std::list<double> list;
// ...
size_t s = list.size(); // Might be an O(n) operation in C  03

std::ios_base::failure std::exception artık kaynaklanmaz

Doğrudan std::exception türetmek için beklediği kodu farklı davranabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ODN

    ODN

    26 Kasım 2006
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008
  • Utah Valley Online

    Utah Valley

    9 AĞUSTOS 2010