next up previous
Next: B..6.3 Java Up: B..6 余談として: C++, C99, Previous: B..6.1 C++ の場合

B..6.2 C99

既に GCC で拡張機能として導入されていた可変長配列だが、 C99 にも採用された。 しかし今のところ GCC の可変長配列機能は厳密には Broken らしい。 ともあれ、簡単にメモしておく。

  1. 配列のサイズが定数でなく、変数でもOKとなった。
  2. FORTRAN 風の整合配列が使えるようになった。


#include <stdio.h>

void test(int n);
void test2(int n);
void test3(int m, int n, double a[m][n]);

void test(int n)
{
  int i;
  double a[n];
  for (i = 0; i < n; i++)
    a[i] = i;
  for (i = 0; i < n; i++)
    printf("%g\n", a[i]);
}

void test2(int n)
{
  double a[2*n][n];
  test3(2*n, n, a);
}

void test3(int m, int n, double a[m][n])
{
  int i, j;
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
      a[i][j] = i * j;
      printf("%g ", a[i][j]);
    }
    printf("\n");
  }
}

int main()
{
  int n;
  printf("n: "); scanf("%d", &n);
  test(n);
  test2(n);
  return 0;
}

C99 については、 『プログラミング言語Cの新機能』 が便利な (日本語で読める) 情報源である。 他にも複素数型などが導入されているとか (もっともこれも GCC は Broken だとか)。


…で、どうなのかな。 これを使ってまじめなプログラムを書いても良いのだろうか。 「C++ は C に対する上位互換性」はまったく成り立たないことになったのは、 色々混乱を招きそうである。 将来的に C++ は C99 のスーパーセットになれるのかどうか? 個人的に気になるのは、 C99 の可変長配列機能と FORTRAN で書かれたライブラリィとの相性であるが、 ネットではそれについての記述がまだないみたい。 そもそも自動変数では巨大な配列を宣言できないだろうから、無理な望みなのか? だったら多次元版 malloc() とかできないか? ちょっと妄想が入ってきた。


(気を取り直して) 英文になるが、次のページは見ておくと良い。


next up previous
Next: B..6.3 Java Up: B..6 余談として: C++, C99, Previous: B..6.1 C++ の場合
Masashi Katsurada
平成18年4月29日