반응형
$@ 목표 이름
$* 목표 이름에서 확장자가 없는 이름
$<

조건 파일 중 첫번째 파일

$? 목표 파일 보다 더 최근에 갱신된 파일 이름

문법

$(addsuffix 접미사, 문자열 )   ex) $(addsufix  .c, memo   main) => memo.c    main.c 

$(addprefix  접두더, 문자열 )  ex) $(addprefix src/, memo main) => src/memo     src/main

$(shell shell command)         ex) SH = $(shell ls *.c)  => shell 명령에 대한 결과가 변수에 들어감

$(subst 찾을 문자, 변경할 문자, 대상 문자)  => "대상문자"에서 "찾을 문자"를 "변경할 문자"로 변경해 준다. 

$(patsubst 찾을 패턴, 변경할 패턴, 대상 문자) => subst와 기능은 동일하나 확장자를 바꿀때 사용함  

$(strip 대상문자 ) => 대상문자에서 모든 공백을 1칸으로 줄인다. 여백이 많아도 모두 1칸으로

$(filter 찾을 문자, 대상문자) => 대상문자에서 찾을 문자를 포함한 문자들을 찾아서 저장한다. 

$(filter-out 찾을 문자, 대상문자) => filter와 반대로 찾을 문자가 있는 경우를 제외하고 저장한다.

$(join 원본문자, 붙일문자) => 원본문자와 붙일문자를 붙여서 한 문자로 만든다.

$(dir  대상문자)           => 대상문자에서 파일문자를 제외한 경로명만 추출한다. 

$(notdir  대상문자)           => 대상문자에서 파일명만 추출한다. 

$(baseanme  대상문자)           => 대상문자에서 확장자를 제외한 문자를 알려준다. 

$(eval func_call)

- eval
우리가 만든 함수를 호출하는 것은 내장함수 call입니다. call은 단순히 우리가 만든 함수를 call이 호출되는 부분에 치환하는 일만을 합니다. 따라서 우리가 만든 함수가 빌드 규칙을 만들기 위한 함수라면 call만으로는 빌드 규칙을 생성할 수 없습니다.

mkdir -p (no error if existing, make parent directory as needed)


<펌 : http://codenakseo.egloos.com/4801079>


<추가 사항>

이 부록은 GNU make 가 이해하는 지시어, 텍스트 조작 함수, 그리고 특수 변수들에 대해서 요약한 것이다. 다른 요약들을 보고자 한다면 See section 특수 내장 타겟 이름(Special Built-in Target Names), section 묵시적 규칙들의 카달로그(Catalogue of Implicit Rules), and section 옵션들의 요약(Summary of Options).

다음은 GNU make 가 인식하는 지시어들을 요약한 것이다:

define variable
endef
멀티-라인, 재귀적으로 확장되는 변수 하나를 정의한다. 
See section 명령들을 묶어서 정의하기(Defining Canned Command Sequences).
ifdef variable
ifndef variable
ifeq (a,b)
ifeq "a" "b"
ifeq 'a' 'b'
ifneq (a,b)
ifneq "a" "b"
ifneq 'a' 'b'
else
endif
makefile 의 조건 평가 부분. 
See section Makefile의 조건 부분(Conditional Parts of Makefiles).
include file
다른 makefile 을 포함한다. 
See section 다른 makefile 삽입(Including Other Makefiles).
override variable = value
override variable := value
override variable += value
override define variable
endef
변수 하나를 정의하고 이전의 정의를 오버라이드하다. 심지어 명령행에서의 정의까지 오버라이드한다.
See section override 지시어.
export
make 에게 차일드 프로세스들에게 디폴트로 모든 변수들을 익스포트하도록 지시.
See section 서브-make에 대한 통신 변수(Communicating Variables to a Sub-make).
export variable
export variable = value
export variable := value
export variable += value
unexport variable
make 에게 특정한 변수를 차일드 프로세스들에게 익스포트할 것인가 아닌가를 지시한다.
See section 서브-make에 대한 통신 변수(Communicating Variables to a Sub-make).
vpath pattern path
`%' 패턴과 일치하는 파일들에 대해서 검색 경로를 지정.
See section vpath 지시어.
vpath pattern
pattern 로 사전에 지정된 모든 검색 경로들을 제거.
vpath
vpath 지시어에 의해서 사전에 지정된 모든 검색 경로들을 제거.

다음은 텍스트 조작 함수들의 요약이다 (see section 텍스트 변환을 위한 함수(Functions for Transforming Text)): Here is a summary of the text manipulation functions (see section 텍스트 변환을 위한 함수(Functions for Transforming Text)):

$(subst from,to,text)
text 에서 from 를 to 로 교체.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(patsubst pattern,replacement,text)
text 에서 pattern 과 일치하는 것을 replacement 로 교체. 
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(strip string)
string 로부터 여분의 공백 문자들을 제거.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(findstring find,text)
text 에서 find 를 찾음(locate).
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(filter pattern...,text)
pattern 단어들중의 하나와 일치하는 text 내의 단어들을 선택. 
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(filter-out pattern...,text)
pattern 단어들중의 하나와 일치하지 않는 단어들을 text에서 선택.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(sort list)
list 에 있는 단어들을 사전식으로 소팅하고 중복된 것들을 제거.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).
$(dir names...)
각 파일 이름에서 디렉토리 부분을 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(notdir names...)
각 파일 이름에서 비-디렉토리 부분을 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(suffix names...)
각 파일 이름의 확장자(마지막 `.'과 다음 문자들)를 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(basename names...)
각 파일 이름의 몸체 이름(확장자를 뺀 이름)을 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(addsuffix suffix,names...)
names 에 있는 각 단어의 뒤에다 suffix 를 붙인다. 
See section 파일 이름들을 위한 함수(Functions for File Names).
$(addprefix prefix,names...)
prefix 를 names 에 있는 각 단어 앞에다 붙인다. 
See section 파일 이름들을 위한 함수(Functions for File Names).
$(join list1,list2)
두 단어들의 병렬 리스트를 묶는다.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(word n,text)
text 에서 n번째 단어(시작은 1)를 추출한다.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(words text)
text 에서 단어들의 개수를 계산한다.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(firstword names...)
names 의 첫번째 단어를 추출한다.
See section 파일 이름들을 위한 함수(Functions for File Names).
$(wildcard pattern...)
쉘 파일 이름 패턴 (`%' 패턴이 아님) 과 일치하는 파일 이름들을 찾는다. 
See section wildcard 함수(The Function wildcard).
$(shell command)
쉘 명령을 실행하고 그것의 결과를 리턴.
See section shell 함수(The shell Function).
$(origin variable)
make 변수 variable 가 정의된 방법을 설명하는 문자열을 리턴. 
See section origin 함수(The origin Function).
$(foreach var,words,text)
words 에 있는 각 단어를 가리키는 var 로 text 를 평가하고 그 결과를 서로 붙인다.
See section foreach 함수(The foreach Function).

다음은 완전한 정보를 대신할 자동 변수들See section 자동 변수들(Automatic Variables)의 요약이다.

$@
타겟의 파일 이름.
$%
타겟이 아카이브 멤버일 때, 타겟의 멤버 이름.
$<
첫번째 종속물의 이름.
$?
타겟보다 더 새로운 모든 종속물들의 이름. 이들 사이는 스페이스들로 구분된다. 아카이브 멤버들인 종속물들의 경우 이름있는 멤버들만이 사용된다 (see section 아카이브 파일을 갱신하기 위해서 make 사용하기(Using make to Update Archive Files)).
$^
$+
모든 종속물들의 이름. 이들 사이는 공백으로 구분된다. 아카이브 멤버들인 종속물들의 경우 이름있는 멤버만이 사용된다 (see section 아카이브 파일을 갱신하기 위해서 make 사용하기(Using make to Update Archive Files)). $^의 값은 중복된 종속물들을 생략한다. 반면에 $+는 그들을 그대로 가지고 그들의 순서를 유지한다.
$*
묵시적인 규칙이 매치된 줄기 (see section 패턴 비교 방법(How Patterns Match)).
$(@D)
$(@F)
$@의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(*D)
$(*F)
$*의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(%D)
$(%F)
$%의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(<D)
$(<F)
$<의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(^D)
$(^F)
$^의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(+D)
$(+F)
$+의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.
$(?D)
$(?F)
$?의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

다음 변수들은 GNU make에 의해서 특별하게 사용된다:

MAKEFILES
make 의 모든 실행때마다 읽히는 makefile들. 
See section MAKEFILES 변수(The Variable MAKEFILES).
VPATH
현재 디렉토리에서 찾을 수 없는 파일들에 대한 디렉토리 검색 경로.
See section VPATH: 모든 종속물에 대한 검색 패스(Search Path for All Dependencies).
SHELL
시스템의 디폴트 명령 해석기의 이름. 일반적으로 `/bin/sh'. 명령들을 실행하는 데 사용되는 쉘을 변경하기 위해서 makefile 에서 SHELL 을 설정할 수 있다. See section 명령 실행(Command Execution).
MAKESHELL
MS-DOS 에서만 사용되며 make 에 의해서 사용되는 명령 해석기의 이름. 이 값은 SHELL 의 값보다 우선한다. See section 명령 실행(Command Execution).
MAKE
make 가 호출된 이름. 이 변수를 명령에서 사용하는 것은 특수한 의미가 있다. See section MAKE 변수가 작동하는 방법(How theMAKE Variable Works).
MAKELEVEL
재귀적 진입의 단계 번호 (서브-make들의).
See section 서브-make에 대한 통신 변수(Communicating Variables to a Sub-make).
MAKEFLAGS
make 에 주어진 플래그들. 플래그들을 설정하기 위해서 환경에서나 makefile 안에서 이것을 설정할 수 있다.
See section 서브-make에 대한 통신 옵션(Communicating Options to a Sub-make).
MAKECMDGOALS
make 에 대해서 명령행에서 주어진 타겟. 이 변수를 설정하는 것은 make 의 작업에 어떤 영향도 미치지 않는다. 
See section goal을 지정하는 매개변수(Arguments to Specify the Goals).
CURDIR
현재 작업 디렉토리(모든 -C 옵션들이, 있다면 처리된 후)의 경로명으로 설정된다. 이 변수를 설정하는 것은 make 의 작업에 어떤 영향도 미치지 않는다.
See section make의 재귀적 사용(Recursive Use of make).
SUFFIXES
make 가 makefile 들을 읽기 전의 접미사들의 디폴트 리스트. 

<펌 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0PhZr&articleno=82&categoryId=5&regdt=20101210200503>


출처: http://kwangja.tistory.com/entry/Makefile-내에서-사용되는-문법-정리 [광자의 세상살이]

 

'language > makefile' 카테고리의 다른 글

makefile or  (0) 2017.03.14
반응형







1. makefile ifeq or 연산

http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or


makefile은 or 연사자가 없음. filter를 이용해야 함


ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

->  ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))










'language > makefile' 카테고리의 다른 글

Makefile 문법  (0) 2018.02.23
반응형

1. https://blog.naver.com/tipsware/221498204578

 

%d, %ld, %lu 등

http://mgoons.tistory.com/6

http://woogyun.tistory.com/391

http://secretroute.tistory.com/entry/1507051744

http://blog.naver.com/cristy82/20007269947

http://blog.naver.com/rasede/150076966887

 

[%s 사용법]

#define STR "1234567890"{   printf("/%2s/\n", STR);   printf("/%20s/\n", STR);   printf("/%20.5s/\n", 1234.56);   printf("/%-20.5s/\n", 1234.56);}

 

(출력결과)

/1234567890//                 1234567890//                         12345//12345                         /

 

[% 출력방법]

sprintf(tmp, "%%");

 

 

'language > C' 카테고리의 다른 글

stack, heap  (0) 2018.07.03
소스 정적분석 툴  (0) 2018.06.29
[C언어] open flag  (0) 2015.07.14
time 함수  (0) 2015.04.21
C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
반응형

http://mycpp.blog.me/120095872757

'language > C' 카테고리의 다른 글

소스 정적분석 툴  (0) 2018.06.29
형식지정자 (printf, sprintf 숫자, 문자 출력)  (0) 2016.08.09
time 함수  (0) 2015.04.21
C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
long long 입출력 관련  (0) 2015.01.28
반응형

http://itguru.tistory.com/113

http://s2kiess.blog.me/220147400129

'language > C' 카테고리의 다른 글

형식지정자 (printf, sprintf 숫자, 문자 출력)  (0) 2016.08.09
[C언어] open flag  (0) 2015.07.14
C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
long long 입출력 관련  (0) 2015.01.28
2차원 배열 크기 구하기  (0) 2013.01.15
반응형
https://kldp.org/node/68231

 

'language > C' 카테고리의 다른 글

[C언어] open flag  (0) 2015.07.14
time 함수  (0) 2015.04.21
long long 입출력 관련  (0) 2015.01.28
2차원 배열 크기 구하기  (0) 2013.01.15
printf format string  (0) 2012.01.18
반응형

출처: http://ko.m.wikibooks.org/wiki/C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%9E%85%EB%AC%B8/%EC%A0%95%EC%88%98%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0

 

 

C 프로그래밍 입문/정수형 데이터

  • 이 문서 주시

 

정수형 데이터편집

C 에서 가장 많이 다루는 데이터 형태는 정수형이고, 그만큼 데이터 타입도 다양하다. 먼저 C 정수형 데이터의 기본 데이터를 확인해 보도록 하자:

타입 바이트수 최소값/최대값 limits.h 상수 접미사 비고
(signed) short (int)
unsigned short (int)
2 -32768 - 32767
0 - 65535
SHRT_MIN, SHRT_MAX
USHRT_MAX
(signed) int
unsigned (int)
4* -2147483648 - 2147483647
0 - 4294967295
INT_MIN, INT_MAX
UINT_MAX

U
(signed) long (int)
unsigned long (int)
4** -2147483648 - 2147483647
0 - 4294967295
LONG_MIN, LONG_MAX
ULONG_MAX
L
UL
(signed) long long (int)
unsigned long long (int)
8 -9223372036854775808 - 9223372036854775807
0 - 18446744073709551615
LONG_LONG_MIN, LONG_LONG_MAX
ULONG_LONG_MAX
LL
ULL

*, **: 이 크기는 컴파일러에 따라 달라집니다. 이 아래에 자세한 내용을 설명하였습니다.
표의 타입에 괄호가 쳐진 것은 원래 있어야 하는 내용이지만 생략이 가능하고 보통은 생략하여 사용한다는 뜻 입니다. 예를 들어 unsinged int 타입은 그냥 unsinged 로 사용할 수 있습니다.


정수 타입의 데이터는 많은 변화를 거쳐왔기 때문에 약간의 혼동의 여지가 있다. 먼저 int 타입이 있는데, 이 int 타입은 가장 효율적으로 처리될 수 있는 정수타입이라는 의미이다. 문제는 효율적으로 처리라는 문구에서 시작되는데, 이 이야기를 하기 전에 먼저 해야할 이야기가 하나 있다.

위에서 설명했듯이 컴퓨터를 분류하는 방법 중에는 n 비트 컴퓨터 - 8비트 컴퓨터, 16비트 컴퓨터 등등 - 라는 표현이 있고, 이 n 비트 컴퓨터라는 말의 기본적인 정의는 n 비트 단위로 데이터를 처리하는 컴퓨터라는 뜻이다. 다른 표현을 사용 한다면 8비트 컴퓨터는 데이터를 처리할 때 8비트씩 읽어들여서 처리 하고, 16비트 컴퓨터는 16비트씩 읽어서 처리 한다는 뜻이다. 의미 상으로는 16비트 데이터를 처리할 때 8비트 컴퓨터는 두 번 일을 해야 하고, 16비트 컴퓨터는 한 번만 해도 된다는 의미로, 수치적으로는 16비트 컴퓨터의 속도가 8비트 컴퓨터의 두 배 빠른 컴퓨터 라는 의미 이다[1].

다시 int 타입에 대해서 이야기 하자면, int 타입은 '가장 효율적으로 처리될 수 있는 정수 타입'이기 때문에 16비트 컴퓨터에서는 16비트, 그러니까 2바이트일 때 가장 효율적이므로 int 타입의 크기는 2바이트 이다. 그리고 32 비트 컴퓨터 일 땐 32비트 즉, 4 바이트일 때 가장 효율적으로 32비트 컴퓨터에서는 int 타입의 크기는 4 바이트가 된다. 그래서 8 비트 컴퓨터나 16비트 컴퓨터의 int 타입은 short int 와 동일한 데이터 타입이 되고, 32비트 컴퓨터의 int 타입은 long int와 동일한 데이터 타입이 된다.

문제는 64비트 컴퓨터가 대두 되었을 때 발생 하였는데, int 타입을 64비트로 잡아주면 long int가 int 보다 다룰 수 있는 데이터의 크기가 적어지는 모순이 생기게 되었다. 그래서 64비트 컴퓨터에서는 int를 32비트로 쓰고 long int를 64비트를 쓰는 경우와, int와 long int 모두를 32비트 컴퓨터와 동일하게 32비트를 쓰고, long long int 라는 새로운 64비트 타입을 도입한 경우가 있다.

일단 위의 표는 C99에서 제시한 표준에 따라 작성되었으며, 상황에 따라서는 위의 표와 다른 경우가 있을 수 도 있다는 것을 알려두기 위해서 위의 내용을 기술하였다.

정수형 상수는 기본적으로 int 타입으로 간주되며 short 타입을 강제하는 접미사는 없다. unsigned 타입의 상수임을 명기 하기 위해서는 u나 U를 사용하면 된다. 예를 들어 그냥 '1'이라고 상수를 사용하면 signed int 타입이 되지만, '1U'혹은 '1u'라 표기하면 unsigned int 타입의 상수가 되고, '1ul' 혹은 '1UL'이라 표기하면 unsigned long int 타입의 상수로 다루어 진다.

정수형 상수를 표기할때 사용할 수 있는 진법은 8진법, 10진법, 16진법이다. 8진법 상수를 표기 할때는 0을 시작으로 8진 숫자를 사용한다. 예를들어 8진수 72를 표기하기위해서는 '072'라 표기해 주면 된다. 16진법을 표기하기 위해 사용되는 접두어는 0x 혹은 0X이고, 16진 숫자를 쓰면 된다. 예를 들어 16진수 ae4f를 표기하기 위해서는 '0xae4f'라 쓰면 된다. 8진수나 16진수 상수를 사용하는 경우에도 10진수에서 사용하는 타입지정 접미사는 그대로 사용할 수 있다.

고정폭 정수 타입편집

이렇듯 데이터의 크기가 환경에 따라 조금씩 달라지기 때문에, 데이터를 쓸 수 있는 값의 차이가 아닌 데이터가 차지하는 메모리 공간이라는 입장에서 봐야 할 땐 이런 일괄적이지 못한 데이터 타입은 프로그래머의 혼란을 야기할 뿐 아니라, 프로그램 코드가 컴파일되는 환경에 따라 다른 코드를 사용해야 하는 문제가 발생한다. 그래서 새로 제시된 타입이 다음과 같은 것 들이 있다.

타입 바이트수 최소값/최대값 stdint.h 상수 비고
int8_t
uint8_t
1 -128 - 127
0 - 255
INT8_MIN, INT8_MAX
UINT8_MAX
int16_t
uint16_t
2 -32768 - 32767
0 - 65535
INT16_MIN, INT16_MAX
UINT16_MAX
int32_t
uint32_t
4 -2147483648 - 2147483647
0 - 4294967295
INT32_MIN, INT32_MAX
UINT32_MAX
int64_t
uint64_t
8 -9223372036854775808 - 9223372036854775807
0 - 18446744073709551615
INT64_MIN, INT64_MAX
UINT64_MAX

데이터 폭이 정해져 있는 타입들과 관련된 상수는 <limits.h> 파일이 아닌 <stdint.h> 파일에 정의되어 있다. 위에 언급된 타입들 외에도 최소 n 비트 이상의 정수 데이터를 저장할 수 있는 타입을 의미하는 int_leastn_t, uint_leastn_t (이때 n은 8, 16, 32, 64)타입과 n비트 이상의 데이터 타입중 가장 빠른 타입이라는 의미의 int_fastn_t, uint_fastn_t 타입, 현 시스템에서 사용할 수 있는 가장 큰 정수형 데이터 타입을 의미하는 intmax_t와 uintmax_t 타입도 표준에는 정의 되어있다.

위 표에 나열 되어있는 데이터 타입들은 사용되는 메모리의 양이 분명해야 하는 경우에 사용되며 산술연산을 위해서는 거의 사용되지 않는다. 주로 네트워크 패킷을 처리하는 프로그램 코드에서 자주 볼 수 있다.

조금 어려운 이야기 -- 바이트 오더 혹은 엔디언편집

위에서 8비트 컴퓨터는 데이터를 8비트 단위로 처리한다는 이야길 했었다. 그러나 8비트로 표현할 수 있는 정수 값은 0 ~ 255 사이의 256개의 숫자 뿐이다. 그러나 실제 프로그램을 작성할 때에는 255보다 큰 값을 처리 해야 할 상황이 발생하기 마련이다. 그런 경우에 2개의 8비트 데이터를 합쳐서 16비트 데이터로 처리 하거나 4개의 8비트 데이터를 합쳐서 32비트 데이터를 처리 해야만 한다.

2개의 8비트 데이터를 합쳐서 덧셈을 하는 경우에는 먼저 2개의 8비트 데이터를 더한 다음에 자리 올림을 해서 다음번 8비트 데이터를 덧셈 하는 방식을 사용하게 된다. 좀더 간단하게 설명하자면 19 + 27을 계산할 때 먼저 9 + 7을 한 다음에 자리 올림 1과 6이라고 계산하고 다시 1 + 2 + 1 (자리올림)을 계산해서 46이라는 값을 얻게 된다.

10진 덧셈 2바이트 덧셈
올림 1 1
1 9 1E 2F
+ 2 7 + 3A E0
4 6 59 0F

위의 표에서와 같이 10진 덧셈이나 바이트 단위의 덧셈 모두 첫번째 자리에서 먼저 덧셈을 한 다음에 올림 값을 포함해서 윗자리의 덧셈을 하게 된다. 문제는 이 덧셈방식이 사람의 감각을 기준으로 해서 진행되는 것 이다. 실제 8비트 컴퓨터에서 16비트 - 2바이트 덧셈을 한다면 방법이 복잡해 진다. 변수는 메모리 공간 이라고 했던 것을 기억 할 것이다. 그렇기 때문에 실제로 8비트 컴퓨터가 하는 덧셈 이라는 것은 먼저 메모리에서 덧셈을 할 데이터를 두개 꺼내서 덧셈을 하고 두 값을 더한 다음에 다시 메모리에 넣는 세 단계 작업을 의미한다. 그림으로 그린다면 다음과 같다.

1 바이트 덧셈
1 바이트 덧셈

8비트 컴퓨터에서 16비트 덧셈을 수행하는 것은 조금 더 복잡하다. 먼저 아랫자리 1바이트 두개를 읽어 더한 다음 자리 올림을 확인하고, 더한 결과를 아랫자리 1바이트 영역에 저장해 둔다. 그 다음 윗자리 1바이트 두개를 읽고 자리 올림과 함께 더해 윗자리 1바이트 영역에 넣어 줘야 한다. 문제는 변수의 메모리 영역을 표시할 때 아랫자리의 위치를 표시하는 것이 아니라 윗자리의 위치를 기준으로 한다는 것이다. 그렇기 때문에 윗자리의 메모리 위치를 얻어낸 다음에 아랫자리 위치를 구하기 위해 메모리 위치 계산을 한번 해야 한다는 것이다. 그리고 위치 계산을 한 값을 가지고 더할 값을 꺼내서 더한 다음 비슷한 과정을 거쳐 저장할 위치를 계산해 내서 값을 저장한다. 아랫자리를 계산하기 위해 덧셈을 세번이나 더 해야 하고, 기준값을 유지하는 작업을 해야 하기 때문에 메모리를 더 필요로 하거나 복잡한 절차를 거처야 한다.

2 바이트 덧셈
2 바이트 덧셈

하지만 위의 그림에서 윗자리에 해당되는 바이트와 아랫자리에 해당되는 바이트를 바꾸면 위와 같은 복잡한 절차를 거치지 않더라도 아랫자리를 더한 다음에 결과를 넣고, 메모리 위치를 1증가 시킨 다음에 윗자리를 더하면 되므로 연산의 수가 줄어들고 연산의 복잡도 역시 줄어들게 된다. 실상 대부분의 CPU에는 인덱스드 모드(indexed mode)라는 연산 방식이 있어 여러자리의 연산을 쉽게 할 수 있도록 하는 어셈블리 명령이 별도로 존재하지만 아무래도 상대적으로 오래된 CPU들은 위에 설명한 방식으로 연산을 수행해야 했기 때문에 연산의 복잡도를 낮추기 위해 아랫자리와 윗자리를 바꿔서 저장을 했다.

아랫 자리와 윗 자리를 바꿔넣는 형태의 데이터 저장방식을 리틀 엔디언(little-endian)이라 하며, 이 방식을 사용하는 가장 대표적인 CPU로는 Intel의 x86 계열의 CPU들이 있다. 반대로 아랫 자리와 윗자리를 바꾸지 않고 그대로 저장하는 방식을 빅 엔디언(big-endian)이라 하며 네트워크를 통해 전송할 때에는 이 형태로 전송 하도록 약속되어 있다. 또한 빅 엔디언을 사용하는 CPU중에 가장 알기 쉬운 것은 매킨토시에서 사용되는 모토롤라의 68계열의 CPU들이다.

빅 엔디언과 리틀 엔디언을 통틀어 엔디언혹은 바이트오더 라고 하며 한 시스템이 아닌 여러 시스템에서 공통적으로 사용되는 데이터를 다룰 때, 특히 네트워크를 통해 데이터를 전송하는 경우에는 엔디언 - 바이트 오더 문제를 반드시 고려해야만 한다.[2]


주석 및 참고 자료편집

  1. 물론 실제적으로는 여러가지 이유에 의해서 두 배 정도가 아니라 몇배에서 수십배 이상의 속도 차이가 납니다. 그 위에 이 n 비트 컴퓨터라는 용어에 대한 수많은 의견이 있기 때문에 이렇게 한마디로 정의해 버리기엔 여러가지 불편한 점이 많기는 하지만, C 언어를 배우는데 있어 가장 필요한 정보만 제공한다는 의미에서 필요 이상으로 용어의 정의에 있어야 할 이야기들을 가지쳐 버렸습니다.
  2. 일반적으로 네트워크를 통해 데이터를 전송 할 때엔 빅 엔디언으로 전송을 합니다. 네트워크를 통해 전송할 때 사용해야 하는 바이트 오더라는 의미로 네트워크 프로그래밍을 할 때엔 빅 엔디언 이라는 용어 보다는 '네트워크 오더'라는 용어를 더 많이 사용합니다. 네트워크를 통해 데이터를 전송할 때엔 상대방 프로그램 외에도 중간에 거쳐야 하는 여러 네트워크 장비를 거쳐야 하기 때문에 오로지 자신이 만든 두 프로그램 사이에서 통신을 하는 경우에라도 데이터, 특히 네트워크 전송시 사용되는 패킷의 해더 정보는 반드시 네트워크 오더로 변환하는 작업을 해야만 합니다.
닫기

이 문서를 개선하는 데 도움을 주세요!

로그인

이 문서의 모든 바뀜을 추적합니다.

로그인

'language > C' 카테고리의 다른 글

time 함수  (0) 2015.04.21
C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
2차원 배열 크기 구하기  (0) 2013.01.15
printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
반응형
char i[2][3];

printf("i[2][3]:%d\n",sizeof(i));

결과: i[2][3]:6


'language > C' 카테고리의 다른 글

C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
long long 입출력 관련  (0) 2015.01.28
printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
callback 함수  (0) 2011.10.06
반응형
http://itguru.tistory.com/64
http://en.wikipedia.org/wiki/Printf_format_string



fprintf

#include <stdio.h> // C++ 에서는 <cstdio>

int fprintf ( FILE * stream, const char * format, ... );

데이터를 형식에 맞추어 스트림에 쓴다. 
특정한 스트림에 일련의 데이터를 특정한 형식에 맞추어 쓰게 된다. 이 때, 그 형식은 형식 문자열에 지정되어 있으며, 출력할 데이터는 형식 문자열 다음에 오는 인자들에 써주면 된다. 

   인자
 

stream

작업을 수행할 스트림의 FILE 객체 

format

C 문자열로 스트림에 써질 텍스트를 포함하고 있다.
또한 이 문자열에는 형식 태그를 부수적으로 포함할 수 있는데 이는 각각의 형식 태그에 대응되는 인자의 데이터가 형식 태그가 지정하는대로 치환된다. 
따라서, 이 문자열에 포함되어 있는 형식 태그의 수는 뒤에 부수적으로 오는 인자의 개수 보다 언제나 같거나 적어야 한다. 
 
형식 태그는 다음과 같은 꼴로 써야 한다. 

%[플래그(flag)][폭 (width)][.정밀도][크기(length)]서식 문자(specifier)

이 때, 형식 태그에서 가장 중요한 부분은 서식 문자로 이는 이 형식 태그에 대응되는 인자의 값이 어떠한 형태로 출력되는지를 조정해 준다. 

서식문자출력 형태

c 문자
a
d or i 부호 있는 십진법으로 나타난 정수 392
e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다. 
3.9265e+2
E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
f 십진법으로 나타낸 부동 소수점 수 392.65
g %e나 %f 보다 간략하게 출력 392.65
G %E나 %f 보다 간략하게 출력 392.65
o 부호 있는 팔진수
610
s 문자열
sample
u 부호없는 십진법으로 나타낸 정수
7235
x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
7fa
X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
7FA
p 포인터 주소
B800:0000
n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
% % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다. 


  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;

        fprintf(fp, "integer : (decimal) %d (octal) %o \n", integer, integer);

        fprintf(fp, "character : %c \n", character);

        fprintf(fp, "string : %s \n", string);

        fprintf(fp, "pointer addr : %p \n", pointer);

        fprintf(fp, "floating point : %e // %f \n", pi, pi);

        fprintf(fp, "percent symbol : %% \n");

        return 0;


  • 출력 결과




  • 파일의 모습



    output.txt 에 우리가 형식 문자열에서 지정해준대로 잘 표시되었음을 알 수 있다. 또한, 콘솔에는 출력을 하지 않았으므로 콘솔에는 아무것도 표시되지 않았다.

    형식 태그에는 위 말고도 플래그, 폭, .정확도, 제한자(modifier), 부-서식문자(sub-specifiers) 에 관련한 정보들이 포함될 수 있다. 먼저 플래그를 살펴보면 플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 플래그는 아래와 같다. 

    플래그설명
    - 폭에 맞추어 왼쪽 정렬을 하여 출력한다. - 를 붙이지 않는다면 기본적으로 오른쪽 정렬이 되어 출력한다. (아래 폭 지정자 참조).
    + 출력 결과값이 양수인 경우라도 + 기호를 앞에 붙여서 출력하도록 한다. (물론 음수면 자동적으로 - 가 붙는다). 기본적으로 지정하지 않았을 경우 음수에만 앞에 - 가 붙는다. 
    (공 백) 앞에 부호가 붙지 않는다면 한 칸을 띄어서 출력한다. (다시말해 123 은 " 123" 으로 출력되고 -123 은 "-123" 으로 출력된다)
    #
    o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각각 0, 0x, 0X 가 붙게 된다. (이 때 0 은 제외한다)
    e, E, f 서식 문자들과 사용되면 소수점 아래 수들이 없음에도 불구하고 강제적으로 소수점을 붙이도록 한다. 원래 소수점 아래 수들이 없다면 소수점을 붙이지 않는다. 
    g 와 G 서식 문자들과 사용되면 e 와 E 일때와 동일한 작업을 하지만 소수들의 뒷부분에 붙는 0 들 (123.1200 등) 은 제거되지 않는다. 
    0 수들을 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신에 0 을 삽입한다. (폭 지정자 참조)

  •   폭은 말그대로 출력되는 데이터의 폭을 지정해준다. 참고로 여기서의 폭(width)은 뒤에 나오는 길이(length) 와는 완전히 다른 개념이므로 유의 하시기 바란다. 


  • 설 명
    (수) 출력할 최소의 문자 개수. 만일 이 수 보다 출력할 수 보다 작다면 빈칸을 삽입하여 길이를 맞춘다. 대신에, 이 수 보다 출력할 수가 큰 수의 경우 잘려서 출력되지는 않는다. 
    * 폭을 형식 문자열에 지정해서 받지 않지만, 그 대신에 형식 문자열 뒤에 오는 인자들에 넣어서 받는다. 이 때, 이는 정수 값이여야 하며 폭을 지정하는 변수 뒤에 출력할 데이터가 위치하면 된다. 

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int i = 123;
        int j = -123;
        double f = 3.141592;

        fprintf(fp, "폭 맞추기 \n");
        fprintf(fp, "i : %6d \n", i);
        fprintf(fp, "i : %7d \n", i);
        fprintf(fp, "i : %2d \n\n", i);

        fprintf(fp, "왼쪽 정렬 \n");
        fprintf(fp, "i : %5d끝 \n", i);
        fprintf(fp, "오른쪽 정렬 \n");
        fprintf(fp, "i : %-5d끝 \n\n", i);

        fprintf(fp, "# 문자의 사용 \n");
        fprintf(fp, "i : %#x \n", i);
        fprintf(fp, "i : %#X \n\n", i);

        fprintf(fp, "부호 붙이기 \n");
        fprintf(fp, "%+d, %+d \n", i,j);
        return 0;
    }

  • 출력 결과

  • 파일에 출력된 모습

  • 이전의 예제와 같이 output.txt 에 우리가 지정한 방식대로 잘 출력되었음을 볼 수 있다. 
    정밀도는 말그대로 수치 데이터를 출력할 때 어떠한 정밀도로 출력하는지 (즉, 몇 자리 까지 출력해야 되는지) 를 지정해준다. 참고적으로 정밀도를 나타낼 때, 앞에 꼭 마침표(.) 을 찍는 것을 잊지 말기 바란다. 마침표를 찍는 이유는 앞에 폭과 구분을 하기 위해서 이다. 

  • . 정밀도설명
    .숫자 정수 지정자 (d,i,o,u,x,X) 의 경우 : 정밀도는 출력되야할 최소의 자리수를 일컫는다. 만일, 어떤 정수의 자리수가 정밀도 보다 작다면 앞에 0 이 붙어서 자리수를 맞추게 된다. 또한 자리수가 더 크다고 해서 정수를 잘라서 출력하지는 않는다. 만일 정밀도가 0 이라면, 소수점 뒤에 자리수를 출력하지 않는다.
    e,E, F 의 경우 : 여기서 정밀도는 소수점 이하 출력될 자리수를 의미한다. 
    g, G 의 경우 : 출력될 유효 숫자의 수를 의미한다.
    s 의 경우 : 출력될 문자의 최대 개수를 의미한다. 원래는 널 문자를 만나기 전까지 모든 문자가 출력되었었다.
    c 의 경우 : 아무 효과 없다.
    만일 정밀도가 지정되지 않는다면 기본값으로 1 이 된다. 또한, 마침표(.) 을 찍었는데 아무런 숫자를 적지 않았다면 기본적으로 0 이 적혔다고 생각한다. 
    .* 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.  

       길이는 출력하는 데이터의 정확한 크기를 지정하는데 사용된다. 예를 들어서 %d 서식문자의 경우 막연하게 '정수형 데이터를 십진법으로 출력한다' 였지만 길이를 지정해주면 어떻나 크기로 데이터를 출력해야되는지 (int 냐 short 냐 등등) 을 지정할 수 있다. 

  • 길이
    설 명
    h 인자를 short int 혹은 unsigned short int 로 생각한다. (오직 i, d, o, u , x, X 서식 문자에만 적용된다)
    l 정수 서식 문자(i,d,o,u,x, X) 에 사용되었을 경우 인자를 long int 나 unsigned long int 로 생각하며 c 나 s 에 사용되었을 경우 wide character 나 wide string 으로 생각한다.
    L 인자를 long double 로 생각한다. (오직 부동 소수점 서식 문자인 e,E,f,g, G 에만 적용된다)

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        double f = 3.141592;
        int i = 12345;

        fprintf(stdout, "f : %.3f \n", f);
        fprintf(stdout, "i : %.10d \n", i);

        return 0;


    출 력 결과


    이번에는 파일 스트림에 출력하는 것이 아니라 표준 출력(stdout), 즉 콘솔 화면에 출력을 해 보았다. 역시 우리가 지정한 형식대로 잘 출력된다. 

    부수적인 인자


    형식 문자열에 따라 함수는 여러 인자들을 가지며, 각 인자는 형식 문자열의 각 형식 태그에 순차적으로 대응된다. 기본적으로 형식 문자열에 들어 있는 형식 태그의 수와 뒤따라 붙는 인자들의 수는 같아야 한다. (물론 .* 이나 * 과 같은 예외적인 상황은 제외한다)

       리턴값
     

    출력 성공시, 화면에 출력된 총 문자의 개수를 반환한다.
    실패했다면 음수가 반환된다.

       실행 예제
     

    /* 

    사용자로 부터 이름을 입력받아 이를 깔끔하게 myfile.txt 에 기록한다.
    이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/
    에서 가져왔습니다. 

     */
    #include <stdio.h>
    int main ()
    {
        FILE * pFile;
        int n;
        char name [100];

        pFile = fopen ("myfile.txt","w");
        for (n=0 ; n<3 ; n++)
        {
            puts ("please, enter a name: ");
            gets (name);
            fprintf (pFile, "Name %d [%-10.10s]\n",n,name);
        }
        fclose (pFile);

        return 0;
    }


    실행 결과


    파일에 출력된 모습


    fprintf 에서 사용한 형식 문자열에 대해 설명을 하자면

    %-10.10s

    먼저 봐야 할 것은 서식 문자인데, s 는 데이터를 문자열로 출력하라는 것이다. 맨 앞의 - 는 문자열을 "왼쪽 정렬" 해서 출력하라는 의미 이다. 그 뒤에 10 은 최소 10 개의 문자를 출력하라는 뜻으로 길이가 10 미만인 문자열은 공백으로 길이를 맞춘다. Psi 다음에 쭉 위치한 공백이 그것이다. 그리고 .10 은 최대 10 문자를 출력하라는 뜻으로 10 문자가 넘으면 잘리게 된다. 위에 Genious Psi 가 잘려서 Genious Ps 까지 출력된 것을 볼 수 있다. 

       연관된 함수
     

    • printf  :  특정한 형식에 맞추어 데이터를 stdout 에 출력한다.
    • fscanf  :  특정한 형식에 맞추어 스트림에서 데이터를 읽어온다.
    • fwrite  :  스트림에 데이터 블록을 쓴다.
    • fputs  :  스트림에 문자열을 쓴다.

    'language > C' 카테고리의 다른 글

    long long 입출력 관련  (0) 2015.01.28
    2차원 배열 크기 구하기  (0) 2013.01.15
    gcc option  (0) 2011.10.26
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    반응형
    출처 : http://www.dreampharos.com/
    퍼온곳: http://psjin14.egloos.com/2989814

    [gcc 컴파일]

    1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)
    2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
    3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
        gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
     

    4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)

        (소스 파일 컴파일 → 오브젝트 파일 생성 → 실행파일 생성 → 오브젝트 파일 삭제) 

     

    ===================================================================================================

     [gcc 옵션]

    1. -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션
    2. -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션
    3. -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생
    4. O2 옵션 : 최적화 레벨 2로 설정. (대부분의 최적화를 시도)
    5. -E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션 (전처리과정 중 발생한 오류를 검증)
                     ※ enhanced Tip: --save-temps 옵션 
     

    6. -S 옵션 : cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다. (*.s)

    7. -c 옵션 : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않는다.
    8. -v 옵션 : gcc가 컴파일을 어떤 식으로 수행하는지를 화면에 출력한다.
    9. --save-temps 옵션 : 컴파일 과정에서 생성되는 중간 파일인 전처리 파일(*.i)과 어셈블리 파일(*.s)을 
                                     지우지 않고, 현재 디렉토리에 저장한다. (오류 분석에 사용)

     ===================================================================================================

     [cpp0 옵션]
    : 소스내에서 사용된 헤더 파일과 define 매크로와 관련된 옵션들이다.
      전처리 과정에서 오류가 발생한다면 cpp0 옵션들을 점검해야 한다.

     1) -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션
    2) -include 옵션 : 헤더 파일을 소스내에 추가할 때 사용한다.
    3) -D[매크로] 옵션 : 매크로를 외부에서 define 할 때 사용한다.
    4) -D[매크로]=[매크로 값] 옵션 : 소스 내에 #define [매크로] [매크로 값] 옵션을 추가한 것과 동일하다.

    5) -U[매크로] 옵션 : -D와 반대로 소스 파일 내에 #undef[매크로] 옵션을 추가한 것과 동일하다.

    6) -M / -MM 옵션 : -M 옵션 - make를 위한 소스 파일의 모든 종속 항목을 출력
                                -MM 옵션 - 기본 include 디렉토리에 있는 헤더 파일은 빼고 종속 항목을 출력한다.

     7) -nostdinc 옵션 : 디폴트 include 디렉토리(usr/include)에서 헤더 파일을 탐색하지 않고,
                               -l 옵션으로 추가한 디렉토리에서만 헤더 파일을 찾는다.

     8) -C 옵션 : -E 옵션과 함께 사용하며, 전처리 과정에서 주석을 제거하지 않는다.
    9) -Wp,[옵션들] 옵션 : 만약 cpp0와 gcc의 옵션이 같은 것으로 중복되면 gcc 옵션으로 해석되므로...

                                    gcc의 해석을 거치지 않고 바로 cpp0 옵션으로 전달하고 싶을 때 사용한다.        

     ===================================================================================================

     [cc1 옵션]
    : "C언어 옵션, 경고 옵션, 최적화 옵션, 디버깅 옵션"의 4가지 종류
      "경고 수위 조절 or 최적화 수위 조절"을 하고 싶을 때 사용한다.

     1. C언어 옵션 : C언어 종류와 표준에 관련된 옵션
       1) -ansi 옵션 : ANSI C 표준에 부합하는 소스를 작성하고자 할 때 사용하는 옵션 
       2) -std=[C 표준들] 옵션 : 기타 다른 표준들을 지정하고자 할 때 사용한다.
       3) -traditional 옵션 : 오래된 Traditional C 문법으로 문법을 검사한다.
       4) -fno -asm 옵션 : gnu89 문법을 바탕으로 asm, inline, typeof 키워드를 사용하지 않기를 원할 때 
                                   사용한다.
        

    2. 경고 옵션 : cc1의 옵션을 조정하여 경고 수위를 조절할 수 있다.
       1) -W / -Wall 옵션 (gcc 옵션 참고)
       2) -w(소문자) 옵션 : 모든 경고 메시지를 제거한다.
       3) -Werror 옵션 : 모든 경고를 컴파일을 중단하는 오류로 취급한다. 

                               (경고가 하나만 나와도 컴파일이 중단된다.)

       4) -pedantic 옵션 : ANSI C89 표준에서 요구하는 모든 경고 메시지를 표시한다.
       5) -pedantic-errors 옵션 : ANSI C89 표준에서 요구하는 모든 오류 메시지를 표시한다.
       6) -Wtraditional 옵션 : 소스가 ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 
                                      경고한다. 

    3. 최적화 옵션 : ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약 (큰 의미 X)
                             ⓑ 실행 파일의 크기를 줄여 실행 속도를 향상시키는 것.

        1) -O0 옵션 : 최적화를 수행하지 않는다.
       2) -O1 옵션 : -O0보다는 조금 낫다. 
       3) -O2 옵션 : 가장 많이 사용하는 옵션. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용
                          (거의 대부분의 최적화를 수행한다.)

       4) -O3 옵션 : 가장 높은 레벨의 최적화. 모든 함수를 인라인 함수와 같이 취급한다.               
                          (Call 인스트럭션은 사용 X. but, 되도록이면 사용하지 않는 것이 좋다. 
                              → 너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있다.)

       5) -O5 옵션 : 사이즈 최적화를 실행한다. (공간이 협소한 곳에서 사용 - 임베디드 시스템)

     

     4. 디버깅 옵션
       1) -g 옵션 : gdb에게 제공하는 정보를 바이너리에 삽입한다.
                    (-g 옵션을 사용하지 않고 gdb로 디버깅하면, 역어셈 → 어셈블리 코드로만 디버깅 가능)

       2) -pg 옵션 : 프로파일을 위한 코드를 삽입한다. 
                     (-pg 옵션으로 컴파일 → gmon.out(프로파일 정보) → gprof로 gmon.out 파일 분석)

    ===================================================================================================

    [as의 옵션]
    : gcc는 as의 옵션에 대해서는 알지 못한다. -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 
      바로 전달해야 한다. -Wa, -al, -as와 같은 형식으로 사용하면 as에게 -al -as 옵션이 같이 전해진다.

     -Wa,[as 옵션들]
    1) -al 옵션 : 어셈블된 인스트럭션을 보인다.
    2) -as 옵션 : 정의된 심볼을 보인다.
    3) -l[패스] 옵션 : include 디렉토리를 지정한다. 어셈블리 소스 내에서 사용된 include 지정자가 
                       지정하는 헤더파일을 찾고자 할 때 사용한다.
    4) -W / --no-warn : 경고 메시지를 출력하지 않는다.
    5) -march=[아키텍처 문자열] : 해당 어셈블리

     ===================================================================================================

     [collect2 / ld 옵션]
    : 링크 옵션

     1) -L[라이브러리 디렉토리] 옵션 : 라이브러리를 찾을 디렉토리를 지정한다.
    2) -l 옵션 : 같이 링크할 라이브러리를 지정한다.
    3) -shared 옵션 : 공유 라이브러리와 정적 라이브러리가 같이 있을 경우, 공유 라이브러리를 우선하여
                             링크한다. (아무 옵션을 주지 않아도 공유 라이브러리를 우선으로 링크한다.)

     4) -static 옵션 : 정적 라이브러리와 공유 라이브러리가 같이 있다면, 정적 라이브러리를 우선하여
                           링크한다. (속도는 빠르지만 파일 사이즈가 커진다는 점 고려할 것!)

     5) -nostdlib 옵션 : 링크시에 표준 C 라이브러리를 사용하지 않는다. 
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     6) -nostartfiles 옵션 : crt1.o 등과 같은 start up 파일을 링크하지 않는다.
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     7) -Wl,[링크 옵션들] 옵션 : gcc를 거치지 않고 바로 링크에게 옵션을 정해주고자 할 때 사용한다.
                                          (사용법은 -Wa와 동일한다.)
       
       < 유용한 링크 옵션들 >
       ① -s 옵션 : 실행 파일에서 심볼 테이블을 제거
       ② -x 옵션 : 출력 파일에서 로컬 심볼 제거
       ③ -n 옵션 : 텍스트 영역을 읽기 전용으로 만듬
       ④ -r 옵션 : 추후 링크가 가능하게 오브젝트를 만듬
       ⑤ -e [name] 옵션 :  시작 심볼을 name 심볼로 사용 (default 시작심볼 : _start 심볼)
       ⑥ -M 옵션 : 심볼들의 정보를 자세하게 출력
       ⑦ oformat [format] 옵션 : 주어진 형식의 오브젝트 파일을 생성

    =============================================================================================================

    'language > C' 카테고리의 다른 글

    2차원 배열 크기 구하기  (0) 2013.01.15
    printf format string  (0) 2012.01.18
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07

    + Recent posts