SORU
8 Aralık 2013, Pazar


Oldukça basit bir c derlerken gcc ve tin arasında farklı sonuçlar 11 program

Farklı davranış, bu basit C 11 program çıkışında gcc vs tin tin tarafından gösterilen bir hata (5.0.2, OS X 10.8.5 böyle büyük mükafat) bağlı olup olmadığını anlamaya çalışıyorum. Kodu aşağıdaki gibidir

#include <iostream>

int main() {


    int matrix[][3]{{1,2,3}, {4,5,6}, {7,8,9}};
    auto dyn_matrix = new int[3][3]{{1,2,3}, {4,5,6}, {7,8,9}};

    std::cout << matrix[0][1] << std::endl;
    std::cout << dyn_matrix[0][1] << std::endl;

    return 0;   
}

Gösterildiği gibi, düzgün bir başlatma anonim paylaşılan başlatmak için kullanmak için çalışıyorum adında) boyut 3x3 çok boyutlu dizi. MacPorts gelen gcc 4.7 ile derleme beklenen çıkışı elde edilir:

$g  -mp-4.7 -std=c  11 dyn_matrix.cpp -o dyn_matrix 
$ ./dyn_matrix
2
2
$

Tersine durumda ise kullanılır çıktı okur:

$ clang   -std=c  11 -stdlib=libc   dyn_matrix.cpp -o dyn_matrix_clang
$ ./dyn_matrix_clang 
2
4
$  

Bu durumda sonuç (görünüşe göre) yanlış. * *10 raporlar:

Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

Suçlu kim? bana, gcc veya clang yapar?

11, 2013: UPDATE DecHata r196995 giderildi. Ne yazık ki, biz hala böyle büyük mükafat ile Apple güncellemeleri önce çınlama birlikte gelen Sürümü Ne kadar süreceğini bilmiyorum.

9 Ekim, 2013: UPDATE DecLLVM bugzilla platformunda bir hata raporu gönderdim. Gerçekten de bir hata olarak kabul edilmiştir, bir yama şu anda inceleme altında, http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131209/095099.html bkz.

Teşekkürler.

CEVAP
8 Aralık 2013, Pazar


Güncelleme:Faisal Vali ve Richard Smith, bu hata sayesinde Çınlama ToT düzeltildi; test file tarafından sunulan taahhüt bakın.


Göre§8.5.1 [malzeme.ınit.aggr]Çınlama yanlış görünüyor:

11/ bir Parantez içinde elided olabilirbaşlatıcı listesiaşağıdaki gibi. Eğerbaşlatıcı listesiSol bir payanda ile başlar, daha sonra başarılı virgülle ayrılmış listesibaşlatıcı-babalarbaşlatır bir subaggregate üyeleri; daha fazla olması yanlıştırbaşlatıcı-babalarüye daha. Ancak, eğerbaşlatıcı listesibir subaggregate bir sol ayraç, sadece yeterince ile başlamıyorbaşlatıcı-babalarliste subaggregate üyeleri başlatmak için alınır; kalanbaşlatıcı-babalarhangi geçerli subaggregate üyesi olduğu toplama bir sonraki üye başlatmak için bıraktı. [Örnek:

float y[4][3] = {
    { 1, 3, 5 },
    { 2, 4, 6 },
    { 3, 5, 7 },
};

tamamen-hazırladı başlatma: 1, 3 ve 5 başlatmak dizinin ilk satır y[0], y[0][0], y[0][1] y[0][2]. yani Aynı şekilde önümüzdeki iki satır y[1] y[2] başlatılamadı. Başlatıcı y[3]s unsurları açıkça float() 0.0 ile başlatılır şeklinde bir ifade ile başlatıldı olarak başlatılır ve bu nedenle erken biter. Aşağıdaki örnekte, parantez içindebaşlatıcı listesielided; ancakbaşlatıcı listesitamamen hazırladı . bu da aynı etkiyi yapar ^em>başlatıcı listesiyukarıdaki örneğin,

float y[4][3] = {
    1, 3, 5, 2, 4, 6, 3, 5, 7
};

Y için başlatıcı bir sol ayraç ile başlar, ama y[0] için değil, bu nedenle listeden üç unsur kullanılır. Aynı şekilde önümüzdeki üç arda y[1] alınır y[2]. —son örnek]

Çünkü geçerli olduğunu düşünüyorum§5.3.4 [ifade.yeni]:

15/ Ayeni ifadebu aşağıdaki gibi nesne türü T başlatır bir nesne oluşturur

  • Eğeryeni başlatıcınesne varsayılan başlatıldı atlandı, (§8.5); eğer başlatma işlemi, nesnesi belirsiz bir değeri var.
  • Aksi takdirdeyeni başlatıcıbaşlatma göre yorumlanır kuralları§8.5doğrudan başlatma için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • spyib

    spyib

    9 Ocak 2007