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. B只讓有定義 SENSOR_H 的原始檔能使用這個標頭檔
  3. 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次以後,內容會被略過。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 把上方程式碼寫在 main 函式中執行時的輸出,下列何者正確?
  2. 微控制器的輸出暫存器以上方的方式宣告並使用。關於這個宣告的說明,下列何者正確?
  3. 關於C語言標準所說的未定義行為,下列說明何者正確?
  4. int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?
  5. 以 gcc 啟用最佳化來編譯上方的函式時,if (p == NULL) 的判斷可能被刪除。其理由為下列何者?