配列の要素アクセス

GCCでは、アドレスを取得できない配列に対しても、添字付けを行うことが出来る。
アドレスを取得できない配列には、以下の二つがある。

  • register修飾されているもの。
  • 関数の戻り値である構造体のメンバであるもの。

この拡張は[]で要素アクセスする場合にのみ利用できる。*や->によるアクセスは出来ない。

#define N 2
struct foo
{
  int mem[N];
};
struct foo bar(void);

int main()
{
  register int baz[N];
  printf("%d\n", baz[0]);		/* baz[0] は標準Cでは不正 */
  printf("%d\n", bar().mem[0]);	/* bar().mem[0] は標準Cでは不正 */
  return 0;
}

GCC拡張について書くのは5ヶ月ぶりか。
久しぶりに書くと、以前書いた内容を忘れていて困る。
そのうち同じ内容で書きそうだ。