Programming Tools/TCPL C Language

어디선가 주워들은 임베디드 C언어 코딩 기술 - 3

LiDARian 2021. 5. 8. 13:27
반응형

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

humaneer.net/253

 

반응형