오늘은 함수포인터를 사용해서 C 의 출력문을 비슷하게 구현 해보았다.

 

먼저 main.h 에 이렇게 소스코드를 작성한다.

#include <stdarg.h>

#ifndef _MAIN_H
#define _MAIN_H

#define null NULL
typedef enum{false, true} boolean;
typedef char *String;

void println(const String format, ...) {
    va_list ap;
    char buf[4096];
    va_start(ap, format);
    vsprintf(buf, format, ap);
    va_end(ap);
    fprintf(stdout, "%s\n", buf);
}

#pragma pack(push, 1)
typedef struct _System{
    struct _OUT_{
        void (*println)(const String, ...);
    }out;
}Sys;
#pragma pack(pop)

Sys System = {println};

#endif

메인문을 아래와 같이 작성한다.

 

 

#include <stdio.h>
#include "main.h"

int main(void){

    int a = 2;
    double b = 0.12;
    String str = "Hello World!";
    
    System.out.println("Hello World!");
    System.out.println("%d %lf", a, b);
    System.out.println(str);
	
    return 0;
}

출력

더보기

Hello World!

2 0.12

Hello World!

이렇게 println 을 구현 할 수있다.

오늘 문득 C로 자바의 클래스를 구현해보고 싶어졌다.

#include <stdio.h>
#include <stdlib.h>

void setUp();
void ca(double *result, double a, double b, char c);

struct _Calculator{
    void (*Calculate)(double*, double, double, char);
}Calculator;

int main(void){
    double result, a, b;
    char c;

    setUp();

    scanf("%lf %c %lf", &a, &c ,&b);
    Calculator.Calculate(&result, a, b, c);
    printf("%g %c %g = %g", a, c, b, result);

    return 0;
}

void setUp(){
    Calculator.Calculate = ca;
}

void ca(double *result, double a, double b, char c){
    *result = (c == '+' ? a + b : c == '-' ? a - b : c == '*' ? a * b : c == '/' ? a / b : 0);
}

구조체와 함수 포인터를 활용해 ca 함수의 메모리 값을 Calculator.Calculate 에 저장한다.

그러면  Calculator.Calculate(&result, a, b, c); 이런식으로 호출을 할 수있는데 &result 는 메인함수에서  대입연산 없이 함수안에서 바로 대입 될수있도록 포인터를 활용했다. 

 

C 언어로 Hello World! 를 출력해 봅시다.

 

#include <stdio.h>

int main(void){

	printf("Hello World!");

	return 0;
}
result> Hello World!

#include <stdio.h>

를 사용한 이유는 printf() 함수를 사용하기 위해 stdio.h 헤더파일을 인클루드 한것입니다.

 

헤더파일이란?

컴파일러에 의해 다른 소스 파일에 자동으로 포함된 소스코드의 파일이다.

 

메인함수는 C/C++ 프로그램의 시작점으로 모든프로그램은 하나의 시작점만 가지고 있어야 합니다.

 

메인문 인수에 void 를 쓴 이유는 인수를 받지 않기위해 쓴 것이고 return 0; 를 사용한것은 운영체제에 오류없이 종료 한것을 알리기 위함입니다.

 

다음시간엔 변수에 대해 알아봅시다.

+ Recent posts