[임베디드 C] 함수의 기본 & 응용

정재훈·2022년 4월 5일
0

임베디드 C언어

목록 보기
8/11
post-thumbnail

함수의 정의 및 사용법

#include <stdio.h>

// [리턴타입] [함수이름]([인자_데이터형] [변수명1], [인자_데이터형] [변수명2] ... )
int abc(int a, int b)
{
	return a + b;
}

// 리턴타입이 없다 = void, 파라미터 없으면 void 혹은 공백
void xyz()
{
	return;
}

int main()
{
	int result;
	result = abc(2, 3);
	return 0;
}

함수의 선언 vs 정의

함수의 선언 => void func1(); : 중괄호 없이 : 로 끝나면 선언
함수의 정의 => void func2() { } : 중괄호 있으면 정의

정의는 중복이 허용되지 않지만, 선언은 중복이 허용된다.

Parameter vs Argument

Parameter : 전달인자
Argument : 실행인자

#include <stdio.h>

int abc(int a, int b)  // a, b는 parameter
{
	return a+b;
}

int main()
{
	int result;
	result = abc(2, 3); // 2, 3 은 argument

	return 0;
}

리턴값 여러개 보내기

함수의 리턴할 수 있는 값은 오로지 1개이다.
리턴값을 여러개 보내는 방법은?

  1. 전역 변수를 이용하는 방법 (비추)
  2. 구조체를 이용하는 방법
  3. 포인터를 이용하는 방법 (강추)

1. 전역 변수를 이용하는 방법 (비추)

#include <stdio.h>

int x;
int y;
int z;

void add(int a, int b)
{
	x = a;
	y = b;
	z = a + b;

	return;
}

int main()
{
	add(2, 3);

	printf("%d %d %d", x, y, z); // 2 3 5

	return 0;
}

2. 구조체를 이용하는 방법

#include <stdio.h>


typedef struct _val_t // 구조체 정의
{
	int a;
	int b;
}val_t;

val_t abc()
{
	val_t node; // 구조체 선언

	// 구조체에 값 넣기
	node.a = 20; 
	node.b = 30;

	return node; // 구조체 반환
}

int main()
{
	val_t get; // 구조체 선언

	get = abc(); // 반환된 구조체 변수의 내용이 get으로 모두 복사됨

	printf("%d %d", get.a, get.b);  // 20 30

	return 0;
}

3. 포인터를 이용하는 방법 (강추)

#include <stdio.h>

void abc(int* a, int* b)
{
	*a = 10;
	*b = 20;
	return;
}

int main()
{
	int num1 = 100;
	int num2 = 200;

	abc(&num1, &num2);

	printf("%d %d\n", num1, num2); // 10 20

	return 0;
}

함수 전방선언

C언어에서 함수는 서로 평등한 관계, 서로서로 호출이 가능하다.
다음 오류가 발생하는 코드를 보고 어디서 오류가 발생하는지 살펴보자

#include <stdio.h>

void abc()
{
	def(); // 여기서 에러 발생
	return;
}

void def()
{
	abc(); 
	return;
}

int main()
{
	abc();
	def();

	return 0;
}

컴파일러는 위에서 부터 차례차례 읽는다. abc함수 입장에서는 def함수는 정의되지 않는 것처럼 생각하기 때문입니다.

해결책

  1. 함수 위로 함수를 옮겨 정의한다. (비추)
  2. 함수를 위에서 선언한다. (강추)

1. 함수 위로 함수를 옮겨 정의한다. (비추)

#include <stdio.h>

void def()  // def 함수를 abc 함수보다 위에 정의해주기
{
	// abc(); 
	return;
}

void abc()
{
	def();
	return;
}

int main()
{
	abc();
	def();

	return 0;
}

이렇게 abc() 함수 위에 사용하려는 def()를 정의시켜준다. 하지만, 이는 좋은 방법이 아닙니다. 코드가 길어지면 유지보수가 하기가 매우 어렵고, def()함수 입장에서는 abc()를 사용하지 못한다.

2. 전방선언 = 함수를 위에서 선언한다. (강추)

#include <stdio.h>

void def(); // def 함수 선언, 선언은 중복이 허용된다.

void abc()
{
	def(); 
	return;
}

void def()
{
	abc(); 
	return;
}

int main()
{
	abc();
	def();

	return 0;
}

다음과 같이 사용하면 abc() 함수에서 def() 사용 가능 하고, def() 함수에서 abc() 함수 사용가능하다.

profile
여러 방향으로 접근하는 개발자

0개의 댓글