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
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ıry[1]
y[2]
başlatılamadı. Başlatıcıy[3]
s unsurları açıkçafloat()
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 üç arday[1]
alınıry[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.
Çözme MSB3247 - Bulundu bağımlı aynı d...
Farklı olduğunu ilk karakteri iki dize...
Java8 akarsu sıralı ve paralel yürütme...
Aynı dalda iki farklı işliyor arasında...
Grafikleri oldukça farklı RGB renkleri...