C言語の基礎
#ifndef SENSOR_H
#define SENSOR_H
typedef struct { int id; int value; } Sensor;
int sensor_read(Sensor *s);
#endifヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
- Aヘッダをコンパイルした結果をファイルに保存しておき、同じヘッダを使うほかのソースファイルのコンパイルを速くする
- BSENSOR_H を定義したソースファイルだけが、このヘッダを使えるようにする
- C同じヘッダが1つのソースファイルに何回インクルードされても中身を1回だけ取り込み、重複した定義のエラーを防ぐ
答えと解説を見る
正解:C. 同じヘッダが1つのソースファイルに何回インクルードされても中身を1回だけ取り込み、重複した定義のエラーを防ぐ
a.h と b.h がどちらも sensor.h をインクルードし、あるソースファイルが a.h と b.h をインクルードすると、sensor.h の中身が2回取り込まれます。1回目に SENSOR_H が定義されるので、2回目は #ifndef SENSOR_H の条件が偽になり、#endif までが読み飛ばされます。この仕組みがないと、構造体の型 Sensor が2回定義されてコンパイルエラーになります。このような書き方をインクルードガードといい、多くのコンパイラでは #pragma once も同じ目的で使えます。
- A. これはプリコンパイル済みヘッダの説明で、インクルードガードの働きではありません。
- B. SENSOR_H はヘッダ自身の中で定義されるもので、ソースファイルの側で定義しておく必要はありません。
- C. 正しい。2回目以降は、中身が読み飛ばされます。