C言語では従来、変数を宣言する際に明示的に型を指定する必要がありました。しかし、C23から導入された型推論機能により、コンパイラが自動的に変数の型を推論することができるようになりました(6.7.9 Type inference)。型推論を使うことで、冗長な型指定を省略でき、コードの簡潔さが向上します。また、ソースコードから変数の型が明確に分かるため、プログラムの保守性も良くなります。

型推論の構文

編集

型推論を使うには、変数宣言時にautoキーワードを型指定子の位置に記述します。

auto x = 初期値;

このように記述すると、コンパイラが初期値の型から変数xの型を自動的に推論します。

型推論の動作

編集

型推論の具体的な動作を説明します。変数宣言がオブジェクト定義の場合、コンパイラは初期化式の値の型を変数の型として推論します。この際、左辺値、配列からポインタへ、関数からポインタへの適切な変換が行われます。また、型指定子で指定された修飾子や属性もあわせて変数の型に反映されます。

型推論ではスコープルールに注意が必要です。推論される識別子のスコープは初期化式の終了後に始まるため、初期化式の中でその識別子を使うことはできません。

構造体や共用体の型定義と変数定義を同時に行う場合の動作は実装定義です。このような宣言は避けるべきでしょう。

型推論の利点

編集

型推論の主な利点は以下のとおりです。

  • 冗長な型指定を省略できるので、コードが簡潔になる
  • コンパイラが厳密に型チェックを行うため、型の安全性が高まる
  • コードから変数の型が明確に分かるので、保守性が良くなる

使用例

編集

型推論はさまざまな場面で使用できます。以下にいくつかの使用例を示します。

ファイルスコープでの変数宣言
auto g_value = 3.14; // g_valueはdouble型
for文でのループ変数宣言
for (auto i = 0; i < 10; i++) {...}
型ジェネリック関数の戻り値型
#include <stdio.h>
#include <tgmath.h>

int main(void) {
    auto x = 3.1415926536 / 4;
    auto y = cos(x);  // yの型はxの型と同じ
    printf("cos(%f) = %f\n", x, y);
    return 0;
}

制限事項

編集

型推論には以下のような制限事項があることに注意が必要です。

  • 構造体や共用体の型定義と変数定義を同時に行うと、動作は実装定義となる
  • インラインで初期化しない変数、extern変数には使えない
  • 可変長配列(VLA)の宣言にはautoは使えない

まとめ

編集

型推論は、コードの簡潔さと型安全性を両立させる有用な機能です。しかし、スコープルールや制限事項にも注意が必要です。適切に活用することで、保守性の高いコードを書くことができます。