[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.