102

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]

4

1 に答える 1

91

Designated Initializersを使用した初期化です。

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

要素の範囲を同じ値に初期化するには、次のように記述し[first ... last] = valueます。これは GNU 拡張です。例えば、

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

ポータブルではありません。with でコンパイルする-pedanticと、そう伝えられます。

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

于 2012-04-09T09:30:20.767 に答える