2013-07-10 8 views
19

Linux çekirdek kaynak böyle dizi değişmezleri bir yeri vardır.açık dizinler? her satır açıkça yerine sipariş güvenmek verilen değerin dizideki indeksini gösterir İşte</p> <pre><code>enum { FOO, BAR }; static const char* const names[] = { [FOO] = "foo", /* wtf is this? */ [BAR] = "bar", }; </code></pre> <p>:

Aranacak deyimi bilmiyorum - bu ne denir? Hangi standart tanımlar? (Ya da bir GNU uzantısı mı?) Bunu C++ veya sadece düz C'de yapabilir miyim? gcc deneme, ben

$ gcc --version 
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE 

Bu komutların

başarı dönmek test.c yukarıdaki ile bulmak:

$ gcc -Wall -c test.c 
$ gcc -Wall -c --std=c90 test.c 
$ gcc -Wall -c --std=gnu90 test.c 
$ gcc -Wall -c --std=iso9899:1990 test.c 
$ gcc -Wall -c --std=c1x test.c 

ve bu komutlar çeşitli lambdas ilgili şikayetler ve operator= başarısız:

$ g++ -Wall -c test.c 
$ g++ -Wall -c --std=c++98 test.c 
$ g++ -Wall -c --std=gnu++98 test.c 
$ g++ -Wall -c --std=c++0x test.c 
$ g++ -Wall -c --std=gnu++0x test.c 

Bu, bunun geçerli C olduğunu (hemen hemen her lehçede), ancak C++ olmadığını gösterir. Ama ben kuşkuluyum. Bunu, Linux çekirdeği dışında herhangi bir yerde kullandığını hatırlamıyorum. Ayrıca, örneğin, this list of constructs valid in C but not C++'da açıklandığı gibi göremiyorum.

+1

Eğer derleyici çizgilerinize '-pedantic' eklerseniz, bunun C99'a eklendiğini göreceksiniz. – caf

+0

Herkese teşekkürler! –

cevap

11

"Belirtilen başlatma" olarak adlandırılan standart C (C99 ve daha yeni) bir parçasıdır. bir adet tanımlayıcı ardından geçerli nesne formunu

[ constant-expression ] 

sahiptir

ise ... dizi türü var ve olacaktır ifadesi olacaktır:

6.7.9 başlatma, paragraf 6 itibaren bir tamsayı sabit ifadesi. Dizi bilinmeyen boyuttaysa, negatif olmayan herhangi bir değer geçerlidir.

ve paragraf 33:

ÖRNEK 9 Diziler kullanılarak isimlendiricileri bir numaralandırma elemanlarına karşılık ilkleyebiliriz: answers at this question, C göre

++ aynı davranışı desteklemiyor. Derleyiciniz uzantı sağlayabilir.

ISO C99 size dizi indeksleri veya yapı alanını belirterek, herhangi bir sırada elemanları verebilir:

Belki daha yararlı size (ve Sorunuza doğrudan cevap) diyor GCC documentation olduğu Uyguladıkları isimler ve GNU C, bunun C90 modunda da bir uzantı olmasını sağlar. Bu uzantı GNU C++ uygulamasında uygulanmadı.

+0

Hangi sürüme sahip olduğunuzu bilmiyorum ama g ++ 4.8.1 ile üye sözdizimi ('[üye] = ...') gayet iyi çalışıyor. –

+0

@AlexisWilke, elbette, ama bu bir derleyici uzantısıdır. –

10

Bu, bir c99 atama başlatıcısı'dur.

Atama başlatıcıları herhangi bir sırayla bir dizi veya yapıyı başlatmanızı sağlar.Aktarılan öğeler, statik nesnelermiş gibi başlatılır.

int bla[16] = {[5] = 42, [9] = 42}; 

bu elemanı bla[5] ve 42 için bla[9] ve 0 kalan tüm elemanları başlatır. Atama, [] arasında bir tamsayı sabit ifadesidir.

Tanımlama, bir enum sabitidir. Bu bir enum sabiti C.'de bir tamsayı sabiti olarak kabul edilir.

Bu özellik bir C özelliğidir ve C++ 'da mevcut değildir.

+0

Hmm ... Her zaman bir GCC uzantısı olduğunu düşünmüştüm ... – 0x499602D2

+2

@ 0x499602D2, bu davranış standartlaştırılmadan önce veya GNU uzantısı olan aralık stili başlatıcılar hakkında bir süre düşünebilirsiniz. [1 ... 6] = 12' gibi bir şey. Link: http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits –

+0

@CarlNorum Bu, * düşündüğüm şeydi. :) Link için teşekkürler! – 0x499602D2

İlgili konular