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行の目的として、正しいものはどれか。

  1. Aヘッダをコンパイルした結果をファイルに保存しておき、同じヘッダを使うほかのソースファイルのコンパイルを速くする
  2. BSENSOR_H を定義したソースファイルだけが、このヘッダを使えるようにする
  3. 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回目以降は、中身が読み飛ばされます。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。
  2. マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。
  3. C言語の規格でいう未定義動作の説明として、正しいものはどれか。
  4. int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。
  5. 上の関数を gcc で最適化を有効にしてコンパイルすると、if (p == NULL) の判定が削除されることがある。その理由として正しいものはどれか。