C集計初期化子で[N…M]はどういう意味ですか?


101

sys.c行123 から:

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

sys_call_table配列への一般的なポインタであることがわかります。ただし、表記は次のとおりです。

[0 ... __NR_syscalls-1]

とは...


編集:
私はここに別のCのトリックを学んだ:#include <asm/unistd.h>される前処理し、その内容に置き換えるとに割り当てられています[0 ... _NR_syscalls-1]


2
いいえ、それは配列へのポインターではなく、ポインターの配列です。配列へのポインターが宣言されますvoid (*sys_call_table)[__NR_syscalls]
PatrickSchlüter

@tristopiaあなたは正しい。私が意味したのは、のような配列へのポインタchar *argv[]です。修繕。
Amumu

回答:


90

指定イニシャライザを使用した初期化です。

範囲ベースの初期化はgnu gcc拡張です。

要素の範囲を同じ値に初期化するには、を書き込み[first ... last] = valueます。これはGNU拡張機能です。例えば、

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

ポータブルではありません。でコンパイル-pedanticで、そのことがます。

ここではどのように機能しますか?
プリプロセッサーは、範囲ベースの構成要素の#include <asm/unistd.h>実際の内容(さまざまなシンボリック定数と型を定義し、さまざまな関数を宣言します)に置き換えます。これらは、ポインターの配列の初期化にさらに使用されます。


これはポータブルではないようです。ですか?
Ivaylo Strandjev

5
@Mehrdad Microsoft CコンパイラはC99標準に準拠していますか?私はここで私のケースを休ませます... c99
Aftnix

3
@Mehrdad:実際には、Designated Initializersの範囲ベースの構成のみがgcc拡張です。DesignatedInitializers自体はC標準で許可されています。
Alok Save

2
@Mehrdad:すみません、私は炎の餌の一部になりたくありません。私の意図は、あなたが誤解していると思った微妙な詳細を明らかにすることだけでした。
Alok Save

2
@Mehrdad:明確にするために、範囲構成はgcc(およびその拡張機能を実装するコンパイラ)にのみ移植可能であり、指定された初期化子は一般にC99(または少なくともその特定の機能)をサポートするコンパイラにのみ移植可能です。
キース・トンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.