출시·고도화 중
C 안내서 · 1/6
C는 운영체제, 임베디드 펌웨어, 데이터베이스, 다른 언어의 런타임처럼 하드웨어 가까이에서 동작하는 소프트웨어를 만드는 데 쓰이는 언어입니다. C 프로그램은 소스 파일을 컴파일러가 기계어로 번역해 실행 파일을 만드는 방식으로 동작합니다. 이 장에서는 컴파일러를 설치하고, 첫 프로그램을 빌드해 실행하고, 경고를 켜는 방법과 빌드가 내부에서 어떤 단계를 거치는지 살펴봅니다.
C 컴파일러는 대표적으로 GCC, Clang, MSVC 세 가지가 있습니다. 어느 것을 써도 표준 C 코드는 똑같이 빌드되므로 운영체제에서 가장 쉽게 설치되는 것을 고르면 됩니다.
| 운영체제 | 권장 컴파일러 | 설치 방법 |
|---|---|---|
| Ubuntu · Debian | GCC | sudo apt install build-essential |
| Fedora | GCC | sudo dnf install gcc make |
| macOS | Clang | xcode-select --install (Command Line Tools) |
| Windows | MSVC | Visual Studio 또는 Build Tools의 "C++를 사용한 데스크톱 개발" 워크로드 |
| Windows | GCC | MSYS2에서 UCRT64 환경의 GCC 패키지 설치 |
설치가 끝나면 터미널에서 버전을 확인해 컴파일러가 경로에 잡혔는지 봅니다.
gcc --version
clang --version
# Windows MSVC는 "Developer Command Prompt"에서
clMSVC의 cl 명령은 일반 명령 프롬프트가 아니라 Visual Studio가 설치하는 Developer Command Prompt(또는 Developer PowerShell)에서 실행해야 환경 변수가 맞게 잡힙니다.
hello.c 파일을 만들고 다음 코드를 넣습니다.
#include <stdio.h>
int main(void) {
printf("Hello, C!\n");
return 0;
}#include <stdio.h>는 표준 입출력 함수 선언을 가져옵니다. 프로그램은 항상 main 함수에서 시작하며, main이 돌려주는 값은 운영체제에 전달되는 종료 상태입니다. 0은 성공을 뜻합니다.
이제 컴파일하고 실행합니다.
# GCC 또는 Clang
gcc -std=c17 -Wall -Wextra -g hello.c -o hello
./hello
echo $? # 종료 상태(0)
# MSVC (Developer Command Prompt)
cl /std:c17 /W4 hello.c
hello.exe-o hello는 출력 파일 이름입니다. 생략하면 GCC와 Clang은 a.out을 만듭니다. -std=c17은 사용할 C 표준을 정하고, -g는 디버거가 쓰는 디버그 정보를 넣습니다. 배포용으로 빌드할 때는 -O2 같은 최적화 옵션을 더합니다.
C 컴파일러는 기본 설정에서 문제가 있는 코드도 조용히 통과시키는 경우가 많습니다. 그래서 처음부터 경고를 넉넉하게 켜 두는 것이 좋습니다.
-Wall: 흔한 실수를 잡는 경고 묶음입니다. 이름과 달리 모든 경고를 켜지는 않습니다.-Wextra: -Wall이 다루지 않는 경고를 더합니다. 쓰지 않는 매개변수 같은 것을 알려 줍니다.-Wpedantic: 표준에 없는 컴파일러 확장을 쓰면 경고합니다.-Werror: 경고를 오류로 바꿉니다. CI에서 경고가 쌓이지 않게 할 때 씁니다./W4가 비슷한 역할을 하고 /WX가 경고를 오류로 바꿉니다.다음 코드는 문법상 컴파일되지만 실수가 두 개 있습니다.
#include <stdio.h>
int area(int width, int height) {
return width * width; /* height를 쓰지 않음 */
}
int main(void) {
printf("%d\n", 3.5); /* %d에 double을 넘김 */
return area(2, 3) == 4 ? 0 : 1;
}-Wall -Wextra로 빌드하면 printf 형식 지정자와 인수 타입이 맞지 않는다는 경고와 height 매개변수를 쓰지 않는다는 경고가 나옵니다. 경고 없이 빌드하면 이런 실수는 실행 중에 엉뚱한 값으로만 드러납니다.
gcc hello.c -o hello 한 줄은 실제로 네 단계를 차례로 실행합니다.
#include로 헤더 내용을 붙여 넣고, #define 매크로를 펼치고, #if 조건에 따라 코드를 고릅니다..o, Windows는 .obj)로 바꿉니다.각 단계를 따로 실행해 결과물을 직접 볼 수 있습니다.
gcc -E hello.c -o hello.i # 전처리 결과(긴 C 코드)
gcc -S hello.i -o hello.s # 어셈블리
gcc -c hello.s -o hello.o # 오브젝트 파일
gcc hello.o -o hello # 링크실무에서는 보통 -c로 소스 파일마다 오브젝트 파일을 만들고 마지막에 한꺼번에 링크합니다. 이렇게 하면 바뀐 파일만 다시 컴파일하면 되므로 빌드가 빨라집니다. 이 방식은 4장에서 Make, CMake와 함께 다시 다룹니다.
--version으로 확인합니다.main에서 시작하고, 반환값 0은 성공을 뜻합니다.-std=c17 -Wall -Wextra(MSVC는 /W4)로 빌드해 실수를 일찍 잡습니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.