[N… M], C toplu başlatıcılarda ne anlama geliyor?


101

Gönderen sys.c hattı 123:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tabledizilere genel bir göstericidir, bunu görebiliyorum. Ancak gösterim nedir:

[0 ... __NR_syscalls-1]

Nedir ...?


DÜZENLEME:
Burada başka bir C hile öğrendim: #include <asm/unistd.h>edilecektir ön işlenen ve içeriği ile değiştirilmesi ve atanmış [0 ... _NR_syscalls-1].


2
Hayır, bu bir diziye işaretçi değil, bir dizi işaretçi. Bir diziye işaretçi ilan edilecekvoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter

@tristopia haklısın. Demek istediğim, dizilere göstericiydi char *argv[]. Sabit.
Amumu

Yanıtlar:


90

Atanmış Başlatıcıları kullanarak başlatmadır .

Aralık tabanlı başlatma bir gnu gcc uzantısıdır.

Bir dizi öğeyi aynı değerle başlatmak için yazın [first ... last] = value. Bu bir GNU uzantısıdır. Örneğin,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Taşınabilir değildir. İle derleme -pedanticsize öyle diyor .

Burada nasıl işliyor?
Önişlemci , menzil tabanlı yapıda #include <asm/unistd.h>gerçek içeriğiyle ( çeşitli sembolik sabitleri ve türleri tanımlar ve çeşitli işlevleri bildirir ) değiştirir ve bunlar daha sonra işaretçiler dizisini başlatmak için kullanılır.


Görünüşe göre bu taşınabilir değil. Nedir?
Ivaylo Strandjev

5
@Mehrdad microsoft c compiler c99 standardına uygun mu?
Davamı

3
@Mehrdad: Aslında, yalnızca Designated Initializers'ın aralık tabanlı yapısı bir gcc uzantısıdır. Designated Initializers'ın kendilerine C standardı tarafından izin verilir.
Alok

2
@Mehrdad: Üzgünüm, herhangi bir alev yeminin parçası olmak istemiyorum, niyetim sadece yanlış anladığını düşündüğüm ince bir detayı açıklığa kavuşturmaktı.
Alok,

2
@Mehrdad: Açık olmak gerekirse, aralık yapısı yalnızca gcc'ye taşınabilir (ve uzantılarını uygulayan derleyiciler) ve genel olarak belirlenmiş başlatıcılar yalnızca C99'u (veya en azından bu belirli özelliği) destekleyen derleyiciler için taşınabilir.
Keith Thompson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.