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의 세 줄의 목적으로 올바른 것은?

  1. A헤더를 컴파일한 결과를 파일에 저장해 두고, 같은 헤더를 사용하는 다른 소스 파일의 컴파일을 빠르게 한다
  2. BSENSOR_H를 정의한 소스 파일만 이 헤더를 사용할 수 있게 한다
  3. C같은 헤더가 하나의 소스 파일에 몇 번 인클루드되어도 내용을 한 번만 받아들여, 중복 정의 오류를 막는다
정답과 해설 보기

정답: C. 같은 헤더가 하나의 소스 파일에 몇 번 인클루드되어도 내용을 한 번만 받아들여, 중복 정의 오류를 막는다

a.h와 b.h가 모두 sensor.h를 인클루드하고, 어떤 소스 파일이 a.h와 b.h를 인클루드하면 sensor.h의 내용이 두 번 받아들여집니다. 첫 번째에 SENSOR_H가 정의되므로, 두 번째에는 #ifndef SENSOR_H의 조건이 거짓이 되어 #endif까지를 건너뜁니다. 이 장치가 없으면 구조체 형 Sensor가 두 번 정의되어 컴파일 오류가 됩니다. 이러한 작성 방식을 인클루드 가드라고 하며, 많은 컴파일러에서는 #pragma once도 같은 목적으로 사용할 수 있습니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. 위의 코드를 main 함수 안에 써서 실행했을 때의 출력으로 올바른 것은?
  2. 마이컴의 출력 레지스터를 위와 같이 선언하여 사용하고 있다. 이 선언에 대한 설명으로 올바른 것은?
  3. C 언어 규격에서 말하는 미정의 동작의 설명으로 올바른 것은?
  4. int와 unsigned int는 32비트로 한다. 다음 중 C 언어 규격에서 미정의 동작이 되는 것은?
  5. 위의 함수를 gcc로 최적화를 켜고 컴파일하면 if (p == NULL)의 판정이 삭제되는 경우가 있다. 그 이유로 올바른 것은?