Skip to main content

C (프로그래밍 언어) 목차 개요 역사 문법 메모리 관리 라이브러리 개발 도구 디버깅 Hello World 프로그램 같이 보기 각주 외부 링크 둘러보기 메뉴MinGW“The Development of the C Language”“Portability of C Programs and the UNIX System”과거 내용 찾기comp.lang.c FAQ 한국어 번역판joinC C 언어 소개The Development of the C LanguageUsing and Porting the GNU Compiler CollectionUsing Gcc: The Gnu Compiler Collection ReferenceAn Introduction to GCCehsh850185324113195-2027672441cb119665180(데이터)

C 프로그래밍 언어절차적 프로그래밍 언어ISO 표준미국의 발명품1972년 개발된 프로그래밍 언어C 프로그래밍 언어 계열시스템 프로그래밍 언어


1972년켄 톰슨데니스 리치유닉스운영 체제프로그래밍 언어데니스 리치커널C++플랫폼ANSI C표준 C 라이브러리운영 체제커널시스템 프로그램AT&T 벨 연구소데니스 리치켄 톰슨PDP-7유닉스PDP-11바이트PL/IMulticsALGOLPortable C Compiler1978년브라이언 커니핸데니스 리치ANSI CC++C99C11C11C1X형식 문법포트란 77malloc유닉스 계열gccgcc윈도OSIDEIDEgcc윈도gcc마이크로소프트마이크로소프트 윈도우C++자바C#윈도우 APIGUI명령 줄 인터페이스동적 링크 라이브러리모바일 응용 소프트웨어소프트웨어 개발 키트GCC디버깅유닉스gdbgdb-server네트워크비주얼 스튜디오이클립스GDB










(function()var node=document.getElementById("mw-dismissablenotice-anonplace");if(node)node.outerHTML="u003Cdiv class="mw-dismissable-notice"u003Eu003Cdiv class="mw-dismissable-notice-close"u003E[u003Ca tabindex="0" role="button"u003E숨기기u003C/au003E]u003C/divu003Eu003Cdiv class="mw-dismissable-notice-body"u003Eu003Cdiv id="localNotice" lang="ko" dir="ltr"u003Eu003Cpu003Eu003Ca href="/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:3.1%EC%9A%B4%EB%8F%99_100%EC%A3%BC%EB%85%84_%EA%B8%B0%EB%85%90_%EC%97%90%EB%94%94%ED%84%B0%ED%86%A4" title="위키백과:3.1운동 100주년 기념 에디터톤"u003E3.1운동 100주년 기념 에디터톤u003C/au003E(~4.11) 오프라인 모임이 4월 7일 열립니다.nu003C/pu003Eu003Cpu003Eu003Ca href="/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EA%B3%BC%ED%95%99%EC%9D%98_%EB%8B%AC_%EC%97%90%EB%94%94%ED%84%B0%ED%86%A4" title="위키백과:과학의 달 에디터톤"u003E과학의 달 에디터톤u003C/au003E이 4월 1일부터 4월 30일까지 진행됩니다.nu003C/pu003Eu003C/divu003Eu003C/divu003Eu003C/divu003E";());




C (프로그래밍 언어)




위키백과, 우리 모두의 백과사전.






둘러보기로 가기
검색하러 가기
























C

The C Programming Language logo.svg
패러다임
명령형 프로그래밍 (절차적 프로그래밍), 구조적 프로그래밍
발표년도
1972년
설계자
데니스 리치
개발자
데니스 리치, 벨 연구소
최근 버전
C11
최근 버전 출시일
2011년 12월 8일 (7년 전)(2011-12-08)
주요 구현체
K&R, GCC, 클랭, 인텔 C, 마이크로소프트 비주얼 C++, 펠리스 C, 와콤 C
방언
사이클론, 언티프 펠럴 C, 스플릿-C, 시크, C*
영향을 받은 언어
B (BCPL, CPL), 알콜 68, 어셈블리어, PL/I, 포트란
영향을 준 언어
AMPL, AWK, C 셸, C++, C--, C#, 오브젝티브-C, 비트C, D, Go, 자바, 자바스크립트, 줄리아, 림보, LPC, 펄, PHP ,피킷, 프로세싱, 파이썬, 러스트, 세드7, 발라, 베릴로그, 스위프트 (프로그래밍 언어)
사용 중인 파일 확장자

.c,.h

C는 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어이다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 리치가 이것을 개선하여 C 언어가 탄생했다. 유닉스 시스템의 바탕 프로그램은 모두 C로 작성되었고, 수많은 운영 체제의 커널 또한 C로 만들어졌다. 오늘날 많이 쓰이는 C++는 C에서 객체 지향형 언어로 발전된 것이다. 또 다른 다양한 최신 언어들도 그 뿌리를 C에 두고 있다.




목차





  • 1 개요


  • 2 역사

    • 2.1 초기 개발


    • 2.2 K&R C


    • 2.3 C99


    • 2.4 C11



  • 3 문법

    • 3.1 연산자


    • 3.2 변수형


    • 3.3 포인터


    • 3.4 분기문



  • 4 메모리 관리

    • 4.1 변수와 메모리 맵



  • 5 라이브러리

    • 5.1 C 표준 라이브러리


    • 5.2 ISO C 라이브러리 헤더



  • 6 개발 도구

    • 6.1 GCC

      • 6.1.1 make


      • 6.1.2 Cygwin


      • 6.1.3 MinGW



    • 6.2 이클립스

      • 6.2.1 Eclipse IDE for C/C++ Developers



    • 6.3 마이크로소프트 비주얼 스튜디오

      • 6.3.1 C 표준 라이브러리


      • 6.3.2 Windows SDK


      • 6.3.3 MFC


      • 6.3.4 DirectX




  • 7 디버깅

    • 7.1 GDB

      • 7.1.1 응용 프로그램 디버깅


      • 7.1.2 원격 디버깅


      • 7.1.3 커널 디버깅



    • 7.2 IDE 디버깅



  • 8 Hello World 프로그램


  • 9 같이 보기


  • 10 각주


  • 11 외부 링크




개요


C는 실질적으로 모든 컴퓨터 시스템에서 사용할 수 있도록 설계된 프로그래밍 언어이다. 예를 들어 BASIC 등과는 달리 다양한 플랫폼에서 ANSI C의 정의에 따르는 비교적 동일한 구현이 가능하다. 모든 C 시스템에는 정규화된 표준 C 라이브러리가 존재한다. 이런 이유와 생성된 프로그램의 높은 성능이 아직까지도 C 언어가 사랑받는 이유 중 하나이다.


이는 반면 오늘날의 널리 쓰이는 거의 모든 운영 체제 커널이 C를 이용해 구현된 이유이기도 하다. 이처럼 C는 시스템 프로그램 개발에 매우 적합하지만, 응용 프로그램 개발에도 많이 쓰이기도 한다.



역사



  • 1963년 - ALGOL 60에서 CPL이 파생


  • 1969년 - BCPL 개발


  • 1970년 - B 언어 개발


  • 1972년 - 벨 연구소 (Bell Laboratories) 에 있는 Dennis Ritchie가 B의 후속으로 C 개발


  • 1983년 - 미국 국가 표준 협회(ANSI, American National Standards Institute) 에서 짐 브로디(Jim Brodie) 주축으로 X3J11 위원회 소집


  • 1983년 12월 14일 - ANSI X3.159-1989 라는 공식명칭으로 C 언어 표준 지정


  • 1999년 - C99 표준안이 ISO/IEC 9899:1999라는 명칭으로 출간됨


  • 2000년 5월 - ANSI의 표준으로 C99가 채택됨


  • 2011년 - 12월 8일 C11 표준안이 ISO/IEC 9899:2011라는 명칭으로 출간됨


초기 개발




C 언어의 개발자인 켄 톰슨과 데니스 리치.


C 언어의 초기 개발은 1969년부터 1973년까지 4년에 걸쳐 AT&T 벨 연구소에서 이루어 졌으며,[1]데니스 리치의 말에 따르면, 가장 창의적인 작업이 이루어진 기간은 1972년이었다. 언어의 이름이 "C"인 이유는 그 특징이 "B" 언어에서 유래되었기 때문이며, 켄 톰슨에 의하면, B 언어는 BCPL 언어의 기본만 남긴 버전이다.


리치와 톰슨에 의해 초기에 PDP-7의 어셈블리 언어로 구현되었던 유닉스 운영체제의 개발과 C 언어의 기원은 밀접하게 연관되어 있다. 결국 그들은 유닉스 운영체제를 PDP-11로 포팅하기로 결정하였다. PDP-11의 기능의 일부, 특히 바이트 접근기능을 활용하지 못하는 B 언어의 부족함이 C 언어의 초기 버전의 개발을 이끌었다.


유닉스의 초기 PDP-11 버전은 어셈블리로 개발되었다. 1973년에 struct 자료형의 추가로, C 언어는 유닉스의 대부분을 C로 쓸 수 있을 정도로 강력해 졌다. 유닉스는 어셈블리가 아닌 언어로 구현된 최초의 운영체제 커널 중의 하나였다.(더 빠른 사례는 PL/I로 쓰인 Multics 시스템, ALGOL로 쓰인 Burroughs B5000을 위한 MCP(Master Control Program)가 있다.) 1977년 경, 리치와 스티븐 C. 존슨이 유닉스 운영체제의 이식성을 향상시키기 위해, C 언어를 추가적으로 변경하였다. 존슨의 Portable C Compiler는 새로운 플랫폼에서의 C의 구현의 기초가 되었다.[2]



K&R C





The C Programming Language의 표지


1978년에 브라이언 커니핸과 데니스 리치가 The C Programming Language라는 책의 초판을 출간했다. 커니핸과 리치의 앞 글자만 따서 C 프로그래머들에게는 "K&R"로 불리는 이 책은, 비공식적이지만 오랫동안 C의 규격과 같은 역할을 했다. 그리하여, 이 책에서 서술하는 C의 판이 "K&R C"란 명칭으로 불리게 되었고, 이 책의 2판에서는 후의 ANSI C 표준을 다루게 되었다.


K&R에서 다음과 같은 기능이 등장한다.


  • 표준 입출력 라이브러리


  • long int 자료형


  • unsigned int 자료형


  • =-와 같은 형태의 복합 대입 연산자를 -= 형태로 변경

    • i=-10라는 코드가 원래 의도한 i =- 10 (i의 값을 10 차감)이 아닌, i = -10 (i의 값을 -10으로 설정)으로 해석될 수 있기 때문에 중의성을 없애기 위해서 형태를 변경했다.


C99



C 언어 표준이 상대적으로 정적으로 남아 있었던 동안, C++는 표준화를 위하여 계속 진화하고 있었다. 1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데, 이는 약간의 세부 사항을 교정하고 국제적 문자 세트에 대한 보다 확장된 지원을 위한 것이었다. C 표준은 1990년대 후반에 더 개정되어, 1999년 ISO/IEC 9899:1999가 출간되었고, 여기서 명시한 규범을 흔히 C99라 부른다. 이는 기술적 교정에 의하여 현재까지 3번의 수정이 있었다. 국제 C 표준은 실무 그룹 ISO/IEC JTC1/SC22/WG14에 의해 관리되고 있다.



C11



2011년 ISO/IEC 9899:2011이 출간되었고, 간단하게 C11라고 부른다. C11 나오기 전까지 개발 버전을C1X라고 부른다. 최종 개발 버전은 2011년도 4월 N1570이었다.



문법



C는 C 표준에 의해 규정되는 형식 문법을 갖고 있다. 포트란 77과 같은 언어와 달리, C 소스코드는 free-form 언어로써 형식 코드에 공백을 마음대로 넣을 수 있다.



연산자




변수형




포인터




분기문




메모리 관리


OS에서 응용 프로그램을 실행하거나, CPU의 프로그램을 실행하기 위해 여러가지 영역으로 나누어 메모리를 할당하고 이를 메모리에 올려 실행 한다.


  • OS: 주로 저장장치에서 실행 파일을 메모리에 올려 실행 한다. 따라서 프로그램에 필요한 메모리는 거의 RAM에 할당하고 실행 한다.

  • CPU을 사용한 장치: OS가 없이 개발자가 설정한 메모리 배치에 따라 코드를 ROM/FLASH에 생산할 때 쓰고, 전원 공급시 실행 한다.

C 언어로 개발된 프로그램은 메모리 입장에서 다음과 같은 할당 영역으로 나누어 생각할 수 있다.


  • 정적 변수: static을 이용하여 정적 변수임을 명시하고, 단 한 번만 초기화되며 프로그램이 시작할 때 생성되어 종료될 때까지 유지된다.

  • 동적 변수: 힙(HEAP)영역을 이용하여 할당 함수를 호출하여 변수 영역을 할당 받아 사용하고, 해제 함수에 의해 반납한다.

  • 자동변수: 함수나 블록( 이용) 안에서 선언하는 지역변수를 사용하면 스택(STACK) 영역에서 자동 할당을 받는다.

CPU을 사용하여 개발하여 장치에 넣어 코드를 실행할 때, 힙 영역을 많이 사용하지는 않는다. 따라서 필요 없다면 메모리 공간을 할당할 필요도 없고 힙관리 프로그램 코드(함수를 개발툴에서 라이브러리 형태로 제공)도 필요하지 않는다. 만약 malloc 등의 함수를 사용하면, 힙 영역을 사용하겠다는 의미 이기 때문에 힙 영역을 개발자가 선언하여 관리 해야 한다. 이 때 힙관리 프로그램 코드는 자동으로 링크 된다. 물론 저 사양의 CPU 경우, 이 함수를 제공하지 않을 수 있는 컴파일러도 있을 수 있다.



변수와 메모리 맵


C 언어 작성된 코드는 컴파일 과정과 링크 과정을 거치면 실행 파일이 만들어진다. 변수는 여러가지 특성이 있다.


  • 초기치를 갖는 변수

  • 초기치가 없는 변수

  • 상수 데이터

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

int count = 4;
char name[50] = "홍길동";
char tel[256];

///////////////////////////////////

int getTel(char *pstr)

static char buff[1024];
gets(buff);
strcpy(pstr, buff);
return strlen(pstr);


int main(int argc, char **argv)

char *paddr;

printf("이름= %sn", name);
getTel(tel);
printf("전화 = %sn", tel);
paddr = (char*) malloc(1024);
if (!paddr)
return -1;
// 블록 시작
int scount;
char *piaddr = paddr;
for (scount = 1024;scount > count;scount--,piaddr++)
*piaddr = getch(); // getch 함수는 표준함수는 아니다.
putchar(*piaddr);
if (*piaddr == 'r')
break;

*piaddr = 0;
printf("주소 = %sn", paddr);
// 블록 끝

free(paddr);
return 0;


이 프로그램 예에서 변수 별로 분리하면 다음과 같은 특성의 변수로 나눌 수 있다.












초기치 변수
int count = 4;

char name[50] = "홍길동"[note 1];


초기치 없는 변수
char tel[256];

static char buff[1024];


상수
"이름 = %sn"

"전화 = %sn"

"주소 = %sn"


스택
(또는 레지스터[note 2])
char *paddr;

char *pstr;

int scount;

char *piaddr;


힙 (heap)
paddr(malloc()에서 할당된 공간)

Notes:




  1. 상수값 "홍길동"은 main() 함수가 시작 되기 전, 초기과정에서 char name[]에 복사 된다. 여러개의 초기치 변수가 있을 경우 블록으로 복사 된다. 따라서 개별적으로 복사하는 기계어 코드가 존재하지 않고, 초기설정과정에서 한번에 복사 된다. 이를 구현하기 위해 컴파일러와 링커는 초기치 값만 모아서 처리 한다. 블록 내 지역변수에서 사용하는 초기치 과정은 다르다. 지역변수에서 초기치를 설정하면 그 위치에 초기치 설정하는 기계어 코드가 삽입된다.


  2. 레지스터는 메모리가 아니다. 따라서 레지스터는 메모리 맵에 없는 내용이다. 지역변수를 스택영역에 잡을 것인가 CPU의 레지스터에 잡을 것인가는 프로그램의 복잡도와 최적화에 따라 달라진다. 함수의 기능이 간단하고 변수의 숫자가 적을 경우 레지스터로 자동 배치 될 가능성이 높아진다.



각 특성별로 나누어 그룹을 지어 메모리에 배치 하는데, 이것을 링커가 한다. 이렇게 그룹은 나누는 것을 세그먼트(SEGMENT) 또는 섹션(SECTION)이라는 단어를 사용한다.


위의 그룹은 가장 기본적인 내용만을 표시 한것이다. CPU와 컴파일 마다 다르다. 어떤 컴파일러는 더욱 세밀히 하기도 한다. 그리고 각 세그먼트 이름도 다르다.


Visual Studio의 맵 이름 예
















변수형태SEGMENT
초기치 변수DATA
초기치 없는 변수BSS
프로그램 코드TEXT
상수CONST
HEAP
스택STACK

컴파일마다 각 세그먼트 이름과 구조가 다르지만, 예를 들어 중요한 세그먼트 만 표시 하였다, TEXT와 CONST는 ROM/FLASH에 배치해도 되는 변하지 않는 세그먼트이므로 같은 부류이고, CPU를 설계하고 코드를 직접 쓰는 경우 ROM/FLASH을 이용한다.


거의 모든 툴에서 이 맵을 파일로 만들어 준다. 물론 옵션으로 설정을 해야하는 경우도 있지만 구조를 얻을 수 있다. 함수와 변수의 위치와 이름 등을 확인할 수 있고, 각각의 세그먼트 크기 등의 데이터를 알 수 있다. 실제 CPU을 다루는 C 언어에서 이런 정보는 중요하다. 내가 사용하는 MCU의 메모리는 얼마나 사용하는지 등을 확인할 필요가 있기 때문이다.



라이브러리


C 언어 함수는 표준함수가 있고, 개발 툴에서 제공하는 함수가 있다. 여러가지 부류가 있고 특성 별로 나누어 lib 파일로 코드를 제공하고 헤더파일로 선언을 알 수 있다.



C 표준 라이브러리



C 표준 라이브러리는 함수 형태와 기능이 정해져 있기 때문에 개발툴별 같다는 특징이 있다.



ISO C 라이브러리 헤더













































































파일명출처설명
<assert.h>
assert 매크로, 논리오류 및 디버깅 시 오류 형 등 지원한다.
<complex.h>C99
복소수 처리용 세트.
<ctype.h>초기의 대-소 문자 변환 함수 제공
<errno.h>함수에서 발생하는 오류 형태 변환등의 오류처리.
<fenv.h>C99
부동소수점 환경 제어.
<float.h>
부동소수점 특성 정의. 두 숫자 사이의 최소 차이(_EPSILON), 숫자의 최대 자리수(_DIG), 숫자의 범위의 표현(_MIN, _MAX).
<inttypes.h>C99정수형 변수의 정확한 변환.
<iso646.h>NA1
ISO 646 문자열 처리.
<limits.h>정수형의 특성 정의, 정수 숫자 범위(_MIN, _MAX).
<locale.h>
로케일( 관련 상수. 국제어 처리를 위한 적용.
<math.h>수학 함수.
<setjmp.h>
setjmplongjmp 매크로 선언.
<signal.h>다양한 예외 처리 제어.
<stdarg.h>아규먼트 변수 처리. va_start, va_arg, va_end 함수 등.
<stdbool.h>C99논리 변수.
<stdint.h>C99정수형 변수의 각종 정의/선언.
<stddef.h>유용한 형과 매크로 정의/선언.
<stdio.h>C 언어의 입출력 제공. printf 등이 포함 되어 있다.
<stdlib.h>
<string.h>문자열 조작.
<tgmath.h>C99수학 함수에서 일반 형 변환 관련.
<time.h>시간과 날짜 변환 함수.
<wchar.h>NA1국제어 등의 처리를 위한 확장 문자(문자열 처리.
<wctype.h>NA1
확장 문자 처리.


개발 도구



GCC



유닉스 계열(리눅스)의 시스템에서 주로 사용하는 C/C++ 언어 개발 도구이다. 리눅스의 OS을 제 컴파일하거나, 각종 응용 프로그램 개발에 사용한다. 또한 X-Windows의 개발 도구로도 사용할 수 있다.


전자 장치의 개발 시 임베디드 OS 포팅에서, 리눅스 커널이나 리눅스 커널 기반으로 하는 OS 커널 자체를 개발하는 도구로 사용한다. 리눅스 커널 기반 임베디드에서 실행되는 응용 프로그램 역시 gcc을 많이 사용한다.



make



여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며 최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있고, 구조로 기술된 파일(주로 Makefile이라는 파일명)을 [make]가 해석하여 프로그램 빌드를 수행하게 된다.



Cygwin



gcc을 윈도에서 실행 할 수 있도록 재 포팅한 것이다.



MinGW


Cygwin에서 분화 된 gcc 기반 개발 라이브러리 이다.



이클립스



이클립스는 다양한 언어와 다양한 OS에서 실행되는 IDE이다. 따라서 여러가지 상황에서 다양하게 적용할 수 있다.



Eclipse IDE for C/C++ Developers


C/C++언어를 제공하는 IDE으로 리눅스의 경우 기존의 gcc을 사용할 수 있도록 연결 설정만 하면 된다.


MinGW

윈도에서 gcc와 연결하여 C/C++ 언어를 사용하여 프로그램을 개발 할 수 있다. MinGW는 다양한 언어를 지원하므로 다른 언어로도 이클립스와 연결하여 개발 도구로 사용할 수 있다.



마이크로소프트 비주얼 스튜디오


마이크로소프트에서 개발, 판매하는 마이크로소프트 윈도우 환경에서 작동하는 개발도구이다. 현재는 C 뿐만 아니라 C++, 자바, C# 등 다양한 언어를 지원하고 있지만 초기의 마이크로소프트 개발 도구는 C 언어로 부터 출발 하였다. 비주얼 스튜디오로는 윈도우 API를 이용한 GUI 프로그램, 명령 줄 인터페이스 환경으로 실행되는 Windows Console Application, 윈도우 서비스, 동적 링크 라이브러리 등의 형태로 소프트웨어를 개발할 수 있고, 최근 버전에서는 모바일 응용 소프트웨어 개발도 지원한다.


비주얼 스튜디오에서 사용 가능한 소프트웨어 개발 키트와 라이브러리는 다음과 같다.



C 표준 라이브러리


표준 C에서 정의하는 라이브러리 함수를 거의 대부분 그대로 사용할 수 있다.



Windows SDK


윈도우 운영체제의 API를 사용할 수 있게 해주는 툴킷이다. 응용프로그램에서 사용 가능한 윈도우 운영체제의 기능은 Windows SDK를 통해 제공된다. 초기에는 C가 기본 언어였으나, 최근에는 C#, C++ 등의 언어 툴킷도 제공한다. 예전에는 Win32 SDK라고 불리었다.



MFC



윈도우 개발에 필요한 Windows API를 클래스로 래핑한 C++ 라이브러리이다.



DirectX


윈도우에서 주로 게임 등을 개발할 때 사용하는 툴킷 이다. 고속의 화면 제어, 음성지원, 3D 등을 지원한다.



디버깅


보통 소프트웨어 개발에서 디버깅의 가장 일반적인 방법은 두가지 이다.


  1. IDE를 통해 소스 수준에서 디버깅 한다. 일명 'BREAK POINT'를 설정하면 그 위치에서 멈추고 해당 상황을 파악할 수 있다. 가장 중요한 파악 대상이 변수의 값으로 표시 화면에 해당 변수의 형과 맞게 변수의 값을 표시 한다. 또한 줄단위로 실행하기, 함수로 들어가기와 나오기 등 IDE에 따라 구성이 다양하다.

  2. 내부 변수나 기타 상황을 printf 형태의 함수를 UART, 네트워크, USB 등과 연결하여 출력함으로써 프로그램 상황을 표시 할 수 있다. 보통 IDE 처럼 다양한 구성이 불가능 할 때 많이 사용한다.
    1. 리눅스 커널의 경우 printfk 함수로 출력하면 정해진 출력 메시지 파일태로 표시할 수 있다.


    2. MCU와 같은 전자장치의 개발에서 개인용 컴퓨터 처럼 성능이 좋은 IDE을 만들기 쉽지 않다. 따라서 저 성능의 IDE을 사용하거나 UART등으로 상황을 출력해서 디버깅 하는 방법을 사용할 수 있다. 구성이 간단해서 개발 소스에 printf 형의 메시지 출력을 추가하면 된다. 개발자가 직접 해야하는 것이 번거롭다.



GDB



GCC을 기반으로 하는 디버깅 도구이다. 따라서 유닉스 계열에서 가장 일반적으로 실행된다.



응용 프로그램 디버깅


GCC 옵션을 디버깅이 되도록 설정하면 디버깅 테이블을 만든다. gdb 실행 중에 이것을 사용한다. GDB을 실행하여 응용 프로그램을 실행하면서 break, 변수, 함수 등의 디버깅을 할 수 있다.



원격 디버깅


GCC에서 gdb는 서버 구조를 사용할 수 있다. gdb-server을 설치하면 네트워크를 통해 디버깅 환경을 구성할 수 있다. 예를 들어 임베디드 개발 시 리눅스 커널을 포팅하고, 해당 리눅스 시스템에 gdb-server를 설치하면 다른 환경에서 이를 통해 응용 프로그램을 디버깅 할 수 있다. 임베디드의 많은 경우 자신의 시스템에서는 디버깅이 만만치 않다. 따라서 원격으로 gdb의 실행 결과를 전송 할 수 있고 이 정보를 바탕으로 이클립스와 같은 IDE와 연동할 수 있다. 보통 리눅스 기반의 임베디드 개발 환경은 이클립스 C++를 사용할 수 있는데, 이것과 결합할 수 있다.



커널 디버깅


원격 디버깅 모드는 리눅스 커널에 사용되는 소스 수준의 디버거인 KGDB에서도 사용된다. KGDB를 사용하면 커널 개발자는 일반 응용 프로그램과 마찬가지로 커널을 디버깅할 수 있다.



IDE 디버깅


비주얼 스튜디오나 이클립스 등의 도구 들은 기본적으로 디버깅 방법을 제시 한다. 이클립스 디버깅은 GDB와 연동해서 구성할 수 있다.



Hello World 프로그램


#include <stdio.h> // C 표준 라이브러리 stdio.h 를 include 한다. 이것으로 printf 함수등을 사용할 수 있다.

int main(void) // 프로그램 호출시 가장 먼저 실행되는 함수

printf("hello, world"); // 표준출력에 hello, world라는 문자열을 출력한다.
return 0; // 0을 반환하고 main(void) 종료.


이 프로그램은 표준출력(stdout)으로 hello, world를 출력한다.



같이 보기


  • B (프로그래밍 언어)

  • C99

  • C11


  • C 언어의 문법
    • C 언어 변수

    • C 언어 포인터


  • C++

  • 오브젝티브-C


각주




  1. Ritchie, Dennis M. (1993년 1월). “The Development of the C Language”. 2008년 1월 1일에 확인함. The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of.  더 이상 지원되지 않는 변수를 사용함 (도움말)


  2. Johnson, S. C.; Ritchie, D. M. (1978). “Portability of C Programs and the UNIX System” (PDF). 《Bell System Tech. J.》 57 (6): 2021–2048. 2012년 12월 16일에 확인함. [깨진 링크(과거 내용 찾기)]




외부 링크


  • comp.lang.c FAQ 한국어 번역판

  • joinC C 언어 소개


  • (영어) Ritchie, Dennis M. The Development of the C Language. History of Programming Languages-II. Second History of Programming Languages conference, Cambridge, Massachusetts, April, 1993. ISBN 0-201-89502-1.


  • Richard M. Stallman: Using and Porting the GNU Compiler Collection, Free Software Foundation, ISBN 0-595-10035-X

  • Richard M. Stallman: Using Gcc: The Gnu Compiler Collection Reference, Free Software Foundation, ISBN 1-882114-39-6


  • Brian J. Gough: An Introduction to GCC, Network Theory Ltd., ISBN 0-9541617-9-3











원본 주소 "https://ko.wikipedia.org/w/index.php?title=C_(프로그래밍_언어)&oldid=23870380"










둘러보기 메뉴


























(window.RLQ=window.RLQ||[]).push(function()mw.config.set("wgPageParseReport":"limitreport":"cputime":"0.544","walltime":"0.672","ppvisitednodes":"value":5806,"limit":1000000,"ppgeneratednodes":"value":48070,"limit":1500000,"postexpandincludesize":"value":42191,"limit":2097152,"templateargumentsize":"value":10938,"limit":2097152,"expansiondepth":"value":22,"limit":40,"expensivefunctioncount":"value":0,"limit":500,"unstrip-depth":"value":0,"limit":20,"unstrip-size":"value":10974,"limit":5000000,"entityaccesscount":"value":1,"limit":400,"timingprofile":["100.00% 542.406 1 -total"," 40.85% 221.576 1 틀:프로그래밍_언어_정보"," 40.20% 218.051 1 틀:정보상자"," 29.64% 160.783 166 틀:정보상자/행"," 20.05% 108.753 2 틀:각주"," 11.35% 61.542 4 틀:ISBN"," 10.74% 58.257 1 틀:웹_인용"," 9.39% 50.934 1 틀:전거_통제"," 8.48% 45.988 1 틀:시작_날짜와_나이"," 6.81% 36.929 1 틀:주요_프로그래밍_언어"],"scribunto":"limitreport-timeusage":"value":"0.104","limit":"10.000","limitreport-memusage":"value":2996012,"limit":52428800,"cachereport":"origin":"mw1347","timestamp":"20190316062318","ttl":2592000,"transientcontent":false);mw.config.set("wgBackendResponseTime":173,"wgHostname":"mw1319"););

Popular posts from this blog

Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

Swift 4 - func physicsWorld not invoked on collision? The Next CEO of Stack OverflowHow to call Objective-C code from Swift#ifdef replacement in the Swift language@selector() in Swift?#pragma mark in Swift?Swift for loop: for index, element in array?dispatch_after - GCD in Swift?Swift Beta performance: sorting arraysSplit a String into an array in Swift?The use of Swift 3 @objc inference in Swift 4 mode is deprecated?How to optimize UITableViewCell, because my UITableView lags

Access current req object everywhere in Node.js ExpressWhy are global variables considered bad practice? (node.js)Using req & res across functionsHow do I get the path to the current script with Node.js?What is Node.js' Connect, Express and “middleware”?Node.js w/ express error handling in callbackHow to access the GET parameters after “?” in Express?Modify Node.js req object parametersAccess “app” variable inside of ExpressJS/ConnectJS middleware?Node.js Express app - request objectAngular Http Module considered middleware?Session variables in ExpressJSAdd properties to the req object in expressjs with Typescript