반응형
1. 전처리문 : #include guards
전처리문은 Macro라고도한다. 말 그대로 문서내용을 복붙한다. 이 때문에 중복선언이 발생할 수도 있다.
다음의 경우를 보자
//main.h
typedef struct ctrlBody{
int getsense;
}TYPE_BODY_HANDLER;
TYPE_BODY_HANDLER body;
int sensordata;
//ctrlBody의 getsense가 1이 될 떄데이터를 읽어 sensordata에 넣는다.
// main.c
#include <main.h>
#include <sensor.h>
main(){
//something
while(1){
sensor(&body);
]
}
// sensor.h
#include <main.h>
void sensor(TYPE_BODY_HANDLER *);
// sensor.c
#include<sensor.h>
void sensor(TYPE_BODY_HANDLER * body){
if(body->getsense){
sensordata = *((uint32_t*)SENSOR_ADDR);
body->getsense=0;
}
}
이렇게 하면 main.c에서 한번, sensor.c에서 한번.
총 두번 main.h를 선언하게 된다. 그러면 뭐다? 컴파일러에서 에러를 뱉는다.
그래서 if,ifdef,ifndef,else 매크로를 사용한다. 예를들면
#ifndef MAIN_HEADER
#define MAIN_HEADER
typedef struct ctrlBody{
int getsense;
}TYPE_BODY_HANDLER;
TYPE_BODY_HANDLER body;
int sensordata;
#endif
이렇게 하면 이미 MAIN_HEADER가 선언 되어있는 두번째 선언에서는, main.h의 내용이 전부 비활성화된다.
이를 모든 코드에 해놓으면(#ifndef MAIN_HEADER가 아니라 다른 이름으로) 모든 헤더가 단 한번만 선언될 것이다.
Visual Studio의 경우, #pragma once를 통해 중복 선언 솔루션을 제공한다.
2. C++와 C에 동시에 사용할 수 있는 라이브러리
#ifndef __cplusplus
extern "C"{
#endif
//코드내용
#ifndef C_PLUS
};
#endif
이렇게 하면 cpp로 컴파일시 조건문 부분이 활성화되어 C언어로 따로 컴파일되고, c언어로 컴파일 시 전처리기가 비활성화 되어 문법에 없는 코드를 자동으로 제거할 수 있다.
**참고
stackoverflow.com/questions/27810115/what-exactly-do-c-include-guards-do
반응형