학습 조건 : clang 설치

: https://rinovation.tistory.com/170 해당 링크와

https://www.vompressor.com/clang-windws/ 해당 링크 참고하면서 clang 설치

개념은 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yong030389&logNo=221698524595 참고

 

왜냐하면 쉘이나 cmd 에서 

clang -std=c89 -W -Wall -pedantic-errors main.c

컴파일 flag로 컴파일할 예정이기 때문

(비쥬얼스튜디오 같은 IDE, 통합 개발 환경을 안 쓰기 때문)

clang -std=c89 -W -Wall -pedantic-errors main.c
//컴파일러, c89표준으로 컴파일하라, Warning 다 켜라, 문제들이 있으면 에러 많이 내뱉어라, 마지막에 main.c 빌드해라
//clang 실제 문서에서 각 컴파일 flag들이 무슨 역할 하는지 적혀있음
//컴파일할 때 어떤 옵션으로 할 것인지 써주는 것들
//main.c 대신에 *.c 하면 모든 C파일 컴파일해서 실행파일 만들어달라고 할 수 있다
//실행파일은 특별히 지정 안 하는 이상 다 a로 나온다.
//윈도우에서는 a.exe, 리눅스에서는 a.out
./a.out

echo $?

 

 

요약: c에서 컴파일 화는 과정, 어떤 라이브러리를 가져오겠다고 #include하는 과정은 <> 안에 있는 해당 텍스트 파일을 열어서 코드를 전부 복붙해오는 과정이라고 생각하면 된다.

 

헤더 파일을 include할 때 실제로 일어나는 일

 

전처리기는 컴파일을 시작하기 전에 include를 찾는다.

 

C의 Hello World (.c) (.h)

#include<stdio.h> //헤더 파일 발견
//C의 #include는 헤더 파일(*.h)을 열어서 그 내용을 복사해서
//아예 이 위치에 붙여버린다.

int main()
{
	printf("Hello World!");
	return 0;
}

즉, 위와 같은 상태로 컴파일을 돌리면

 include로 가져온 파일 속에 있는 모든 코드들도 먼저 같이 포함된 상태로

컴파일이 되는 것이다.

 

C#의 Hello World (.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Hello_World
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            //Console.WriteLine()같은 함수는
            //C#언어를 사용하면 가져다 쓰라고 만든 함수, 변수들을 모아놓은 것들 중 하나
        }
    }
}

 

#include

: #이 붙는 것들은 전처리기(Preprocessor) 지시문

전처리기:

Preprocessor : Pre + processor, 프로세서 전

실제 처리하기 전(컴파일을 하기 전)에 텍스트를 복붙해주는 일을 함

C# C
using System; #include<stdio.h>

C#에서 using 지시문과 비슷한 일을 함

다른 파일에 구현된 함수나 변수를 사용할 수 있게 해줌

다만 C#처럼 똑똑하게 알아서 함수나 변수를 찾아주지는 않음

 

#include< >

: 괄호 안 파일 찾아서 포함해라!

<> 안의 단어(stdio.h)는 실제 디스크 상에 존재하는 파일 이름

 

실제로

C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt

경로로 파고들어가면

<stdio.h>

 

C 표준 라이브러리 중 일부(C Standard Library)

C 표준 라이브러리란 다음에 필요한 매크로, 자료형(data type), 함수 등을 모아 놓은 것이다.

- 문자열 처러

- 수학 계산

- 입출력 처리

- 메모리 관리

 

#include<stdio.h>

libc에서 표준 입출력(Standard Input and Output)을 담당

스트림 입출력에 관련된 함수들을 포함(콘솔 키보드 스트림이냐 파일 스트림이냐 다를 수는 있음)

c#의 System namespace와 비슷한 역할을 가진 라이브러리

stdio 라이브러리에 있는 함수 몇가지 예

- printf()

- scanf()

- fopen()

- fclose()

 

main(void) 함수

int main(void)
{
	return 0;
}

- 프로그램의 진입점 (entry point) : 언제나 하나 작성해놔야만 한다.

- c 코드를 빌드해서 나온 실행파일(.exe 또는 .out)을 실행하면 main(void) 함수가 자동적으로 실행됨

- 반드시 int 를 반환해야 함

- 최종 0 빈환: 프로그램을 실행하고 종료까지 하는데 아무 문제가 없었다는 뜻

- C는 모든 것이 절차적이기 때문에 main 함수에 c#과 달리 static이 안달려있다

 

        static void Main(string[] args)
        {
        }
        //C#에서 static은 OOP 언어인 것을 절차적으로 프로그래밍하기 위해서 우겨넣었다고 생각하면 쉽다

 

 

+ Recent posts