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把編譯標頭檔的結果存成檔案,讓使用同一個標頭檔的其他原始檔編譯得更快
- B只讓有定義 SENSOR_H 的原始檔能使用這個標頭檔
- C即使同一個標頭檔在一個原始檔中被引入多次,內容也只取入一次,防止重複定義的錯誤
查看答案與解析
正確答案:C. 即使同一個標頭檔在一個原始檔中被引入多次,內容也只取入一次,防止重複定義的錯誤
若 a.h 與 b.h 都引入 sensor.h,而某個原始檔引入了 a.h 與 b.h,sensor.h 的內容就會被取入兩次。第1次時 SENSOR_H 被定義,因此第2次 #ifndef SENSOR_H 的條件為偽,會略過直到 #endif 的內容。若沒有這個機制,結構型別 Sensor 會被定義兩次而發生編譯錯誤。這種寫法稱為引入防護(include guard),在許多編譯器中也可以用 #pragma once 達到相同目的。
- A. 這是預先編譯標頭檔的說明,不是引入防護的作用。
- B. SENSOR_H 是在標頭檔本身中定義的,不需要在原始檔一側先定義。
- C. 正確。第2次以後,內容會被略過。