반응형

http://kldp.org/node/105616

다른 곳에서 나를 호출할 수 있도록 해 주는 것??

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

printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
데이터 타입  (0) 2011.07.14
컴파일 오류 메세지  (0) 2011.07.07
bool  (0) 2011.07.07
반응형

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

gcc option  (0) 2011.10.26
callback 함수  (0) 2011.10.06
컴파일 오류 메세지  (0) 2011.07.07
bool  (0) 2011.07.07
int vs char 차이  (0) 2011.07.07
반응형

1. Implicit declaration
http://hezekiah81.blog.me/140026550064

2. suggest parentheses around assignment used as truth value
http://cafe.naver.com/mcbugi/38464

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

callback 함수  (0) 2011.10.06
데이터 타입  (0) 2011.07.14
bool  (0) 2011.07.07
int vs char 차이  (0) 2011.07.07
warning - array subscript has type `char'  (0) 2010.01.06
반응형

결론>
linux에서 include<stdbool.h>을 이용하자.

함수의 리턴 데이터 타입은 bool로 기록하여 함수만 봐도 리턴값을 예측할 수 있도록 하자
비교문 안에 true, false와 직접적으로 기록하지 말자
예) if(a==true)

stdbool.h 파일 내용


 





출처>

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/FAQ/CfaqHTML/node11.html#9.1

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

데이터 타입  (0) 2011.07.14
컴파일 오류 메세지  (0) 2011.07.07
int vs char 차이  (0) 2011.07.07
warning - array subscript has type `char'  (0) 2010.01.06
extern  (0) 2009.07.02
반응형
결론>
- int가 char보다 속도가 빠르다.
 - 메모리가 부족하다면 char, 아니라면 int
 - 데이터 타입이 다른 것끼리 연산할 경우 반드시 데이터 타입을 동일하게 형변환하여 연산
    그렇지 않으면, 컴파일 오류가 발생하지 않아도 결과가 어떻게 나올 지 판단하기 어려움

http://blog.chanywa.com/44
http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/1/true
http://webcache.googleusercontent.com/search?q=cache:aGUlS59ZMQ8J:wowmymwow.tistory.com/attachment/cfile2.uf%40152510254B146EEC70A751.txt+int+char+%EC%86%8D%EB%8F%84&cd=2&hl=ko&ct=clnk&gl=kr&source=www.google.co.kr
http://cafe.naver.com/carroty/128725
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=71271317&qb=aW50IGNoYXIg7IaN64+E&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gmR6Qg331xlssttId5Vssv--047643&sid=ThUCs9zpFE4AACGOIas

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

컴파일 오류 메세지  (0) 2011.07.07
bool  (0) 2011.07.07
warning - array subscript has type `char'  (0) 2010.01.06
extern  (0) 2009.07.02
BCD(binary Coded Decimal)  (0) 2009.06.23
반응형

gcc에서 배열을 읽을때, 배열을 읽는 값을 unsigned 형으로 하지 않을 경우 생기는 경고이다

 

char temp[20];

char arr_idx = 0;

 

temp[arr_idx];

 

라고 했을 경우, arr_idx의 값이 char형이라서 음수가 될수도 있으므로 이를 방지하기 위해

gcc에서 경고를 발생시킴

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

bool  (0) 2011.07.07
int vs char 차이  (0) 2011.07.07
extern  (0) 2009.07.02
BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
반응형
출처: http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=61+4XczcSTtNeRadtEceQZxhRcPh2Atk&qb=ZXh0ZXJu&enc=utf8&section=kin&rank=3&sort=0&spq=0&pid=fCxq4doi5Uhssc/OgL4sss--095497&sid=SkwNzXfqS0oAAHNLNFs

- 프로그래머의 [적] 전역변수 -

 

안녕하세요.. extern에 대해 고민이 많으시군요..

한때, 저도 고민 많이 햇답니다.. extern << 이넘의 실체는?

전 이렇게 분류 하고 싶네요..

1. static 변수... 즉

void main 위에 위치하는 넘까지 포함해서..

  -- 전.역.변.수 -- 라고 부르고 싶네요..

2. 지역변수

{   } 안에 위치한넘... ( ) 포함해서.

 -- 지.역.변.수 라고 부르고 싶네요.

3. 광역변수

모든 프로젝트에 위치한넘.

 

 

전역변수는 에서는 선언된 이후라면 어디든 사용이 가능하죠..

하지만.. .h니 .c 니 이렇게 여러 프로젝트 단위로 나뉘어진 변수라면..

상.당.히 골치 아픕니다...

 

먼저 컴파일러가 되어서 생각 해보죠..

------- 1.c

int a;   // a가 선언 되어있네?

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

-------- 2.c

// 새로 컴파일을 시작하네?

int sam()

{

   a = 10;  // 아자.. 이건 어디서 굴러먹다온 뼉다그야.. ㅡㅡ 젝힐.....

}

// 몰라 배째 error

 

그럼 광역변수는 어케 되는걸까 잠시 보죠..

위의 예를 가지고 하죠

 

프로그래머 : 난 a를 광역으로 쓰고 싶다그.....

PC : 그럼 광역으로 쓴다는 걸 알려줘 어느넘인지 모르겠어..

프로그래머 : 알따 헤더파일을 만드러주지 ㅡㅡ

 

------------ 1.h
extern int a;  // a너는 누구라도 쓸수 있는거야~~ 앙?

 

------- 1.c

#include "1.h"

int a;   // a가 선언 되어있네? 메모리에 공간을 잡자..

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

 

 

-------- 2.c

#include "1.h"

// 새로 컴파일을 시작하네?

int sam()

{

   a = 20;  // 어라?  a가.. 전체적으로 사용하네.. (메모리 공간이 잡혀있나?) 오.. 잡혀있다.

}

// 좋아 굳굳굳...

 

------------ 즉 extern 선언은 컴파일러가 알아 듣기 위한 최소한의 요구 사항입니다.

아니면, 해당 변수를 찾을수가 없어서. 난리 치는거죠.. ㅠㅠ

이보다.. 간결한 방법은.. ^^;;;;;;; 쓰지 않고 지역 변수를 사용 하는 방법 입니다만...

 

모바일 프로그램 같은.. 속도를 요하는 프로그래밍에서는 변수를 지역으로 잡아서 새로이 생성 하는데 리스크가 너무 크다고 생각합니다.

int sam()  // 100번만 호출되도

{

   int a;  // 100번 생성해야하니 원~!!!

}

그래서 어쩔수 없이 전역 혹은 광역변수를 사용 하지요..

 

또한,, 모바일 OS 포팅 같이 꽤 방대한 분량의 코드에서는 전역변수 저넘이 어느 타이밍에서 어떤 값으로 변환되는지 알기가 쉽지 않아서.. 분담코드 작성에는 매.우. 비효율적입니다...

----------

아.. 이 난관을 어케 해야하노 ㅠㅠ.....

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

int vs char 차이  (0) 2011.07.07
warning - array subscript has type `char'  (0) 2010.01.06
BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
반응형
출처: http://blog.naver.com/pointer98?Redirect=Log&logNo=150036254254

전처리 지시어는 컴파일 직전에 처리된다.

 #include

ex> #include <stdio.h>

이 지시어는 헤더 파일을 지시어가 들어가 있는 위치에 헤더파일을 포함시키는 것이다. < >괄호를 사용하면 표준 헤더 파일 디렉토리에서 지정한 파일을 찾는다. 같은 폴더일 경우에는 " "괄호를 사용한다. 물론 <>, ""의경우 어떤 것을 사용해도 상관은 없다 해당 폴더를 검색해서 해당 파일이 없다면 다른 폴더도 검색하기 때문이다.

 

#define

ex> #define NUM 1

(치환전) int Arr[NUM]; -> (치환후) int Arr[1];

이 지시어는 거의 치환의 의미로 사용됩니다. 위의 NUM을 컴파일하기전에 전처리기는 1로 대체한다. NUM이 어디에 있든 찾아내서 1로 바꾼다.

 

ex> #define TEXT "전처리 지시어"

(치환전) printf("%s", TEXT); -> (치환후) printf("%s", "전처리 지시어");

또한 정수형과 같이 문자열로도 치환이 가능하다.

 

ex> #define MAX

#ifdef MAX

  //MAX가 define되어 있다면 해당 코드가 컴파일 된다.

#else

  //MAX가 define되어 있지 않다면 해당 코드가 컴파일 된다.

#endif

또한 MAX로 정의는 하지만 대치시키지는 않도록 할수도 있다. 이것은 #ifdef ~ #elif ~ #else ~ #endif 문과 같이 사용되면 상당히 유용하게 사용된다. 이런것을 조건부 컴파일이라 한다.

 

#undef

ex>

#undef MAX

//이 아래 부터서는 MAX는 정의 되어 있지 않게 된다.

#ifdef MAX

  //MAX가 undef 되어 코드를 컴파일하지 않는다.

#else

  //MAX가 undef 되어 코드를 컴파일 한다.

#endif

이 지시어는 define으로 정의된 것을 해제하는 것으로 해당 코드 아래 부터서는 MAX의 정의가 되어 있지 않은 것으로 간주 한다.

 

ex>

#define SIZE 100
i = SIZE;

#undef SIZE
#define SIZE 200
j = SIZE;

또한 Define으로 정의한 것을 다시 정의하면 컴파일 에러를 일의킨다. 이때 사용하는 것이 undef이다. 위와 같이 사용하면 컴파일 에러는 나지 않는다.

 

#if, #else, #endif

ex>

#if 0

  //if 가 0 이기 때문에 이 코드는 컴파일 되지 않는다.

#else

  //if 가 0 이기 때문에 이 코드는 컴파일 된다.

#endif

이 지시어는 일반 적인 if문과 동일 방식으로 동작한다.

 

#if 0

  //대용량 코드

#endif

또한 대용량코드를 주석 처리를 하지 않고 한번에 컴파일에서 삭제가 가능하다는 것이다.

 

#ifdef, #elif

ex>

#ifdef MAX1

  //MAX1 이 정의 되어 있다면 이곳의 코드를 컴파일 한다.

#elif MAX2

  //MAX1 이 정의 되어 있지않고 MAX2가 정의 되어 있다면 이곳의 코드를 컴파일 한다.

#else

  //MAX1 과 MAX2 가 정의 되어 있지 않다면 이곳의 코드를 컴파일 한다.

#endif

이 지시어는 MAX1 과 MAX2가 정의(Define)되었는지 체크하고 그에 해당하는 코드를 컴파일하게 된다.

 

#ifndef

ex>

#ifndef FILENAME_H

#define FILENAME_H

  //코드

#endif

이 지시어는 ifdef와 반대로 해당 수식어(FILENAME_H)가 정의 되어 있지 않다면 참으로  #endif 까지의 코드를 컴파일 하게 된다.

또한 이것은 헤더 파일이 중복되어 선언 되지 않도록 할때 자주 사용 되는 방식이다.

 

defined()

ex>

#if defined(DEBUG1) || defined(DEBUG2) || defined(DEBUG3)

  #define GEN_DEBUG(x) {printf x;}

#else

  #define GEN_DEBUG(x)

#endif

이 지시어는 해당디파인이 되어있다면 1을 아니면 0을 반환한다. 일반 if문과 같이 사용하여 DEBUG1, DEBUG2, DEBUG3중 하나만 Define되어 있다면 참으로 인식하여 컴파일을 하게 된다. 이것은 디버그를 사용할때 자주 쓰이는 방식이다.

 

#error

ex>

#if !defined(__cplusplus)

#error C++ compiler required.

#endif

이 지시어는  전처리기가 해당 코드를 실행하게 되면 에러 메시지를 출력시키고 컴파일 작업을 하지 않도록 만든다.

 

#line

ex>

x = 1;                       //3번 라인

#line 100 "main.c"     //4번 라인

y = 1;                      //100번 라인

이 지시어는 사용자를 위한 문장이기 보다는 컴파일러 자체를 위한 프리프로세서문이다. 실제 컴파일 에러가나면 line을 거치면서 5번 라인이 아니라 100라인에서 에러가 난것으로 나타난다.

 

기타 전처리기 사용방법

매크로 함수(Macro function)

매크로 함수도 전처리기로 사용할 수 있다. 다만 디버깅이 힘들어 많이 사용되지 않는다.

ex> 

#define CUBE(x) ((x)*(x)*(x))

(치환전) y = CUBE(x);  -> (치환후) y = (x) * (x) * (x);

 

매크로 함수를 사용한다면 ()를 남발하는 습관을 키워야 한다.

ex>

#define CUBE(x) (x*x*x)

(치환전) y = CUBE(3+4);  ->  (치환후) y = (3+4 * 3+4 * 3+4);

위와 같은 경우 우리가 생각한 값은 나오지 않는다.

 C++ 사용자는 매크로 함수보다는 template이나 inline 함수를 사용해야 한다.

 

문자열 조작

ex>

#define SAY(x) printf(#x)

(치환전) SAY(Hello, world!);  ->  (치환후) printf(“Hello, world!”);

위와 같이 식별자 앞에 # 를 붙이게 되면 자동으로 “x” 와 같이 “”로 둘러 싸 준다.

 

문자열 결합 

 ex>

#define Print(x) Print ## x

(치환전) Print(One)  ->  (치환후) PrintOne

(치환전) Print(Two)  ->  (치환후) PrintTwo

## 는 두 개의 문자열을 결합해 준다. 위와 같이 사용하면 PrintOne 이라는 문자열로 대치되고 Print(Two) PrintTwo 라는 문자열로 대치된다.

 

assert() 

 ex>

#ifndef DEBUG

  #define ASSERT(x)

#else

  #define ASSERT(x) \

       if ( ! (x) ) \

       { \

             printf(#x); \

             printf(“ is NULL on line %d in file %s”, __LINE__, __FILE__); \

       }

#endif

대부분의 컴파일러는 ASSERT() 매크로를 가지고 있다. 

DEBUG 정의에 따라 디버그때만 코드가 생성되고 릴리즈시에는 코드가 생성되지 않게 할 수 있는 것이다.

또한 여러 줄이 필요할 때는 \ 가 사용되었다는 것에 유의하자.

 

ex> /* VC++6.0의 asert() */

#define _ASSERT(expr) \
        do { if (!(expr) && \
                (1 == _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, NULL))) \  //Debug 정보를 출력
             _CrtDbgBreak(); } while (0)  //자동으로 Debug Break를 잡아 준다. 이것 만으로도 유용하게 사용이 가능하다.

 

내장 매크로

ex>

printf(“ is NULL on line %d in file %s”, __LINE__, __FILE__);

컴파일 시에 컴파일러가 미리 정의하고 있는 매크로들 이다. 

매크로명

타입

설명

__DATE__

문자열

컴파일하는 날짜

__TIME__

문자열

컴파일하는 시간

__LINE__

정수

컴파일하고 있는 번호

__FILE__

문자열

현재 컴파일 하고 있는 파일의 이름

__TIMESTAMP__

문자열

소스 파일의 최종 변경 날짜와 시간

 ex>

printf("%d\n", __LINE__);  //컴파일시의 해당라인 번호로 치환된다. - 1234

printf("%s\n", __FILE__);  //컴파일시의 해당파일Path로 치환된다. - c:\main.c

printf("%s\n", __DATE__);  //컴파일시의 날짜로 치환된다. - Jan 1 2009 / 월.일.년

printf("%s\n", __TIME__);  //컴파일시의 시간으로 치환된다. - 15:31:17 / 24시간:분:초

printf("%s\n", __TIMESTAMP__);  //컴파일시의 날짜와 시간으로 치환된다. - Mon Jan 1 15:31:17 2009 / 요일.월.일.24시간:분:초.년

 

반응형
10진수 111을 BCD로 저장할 때는 그냥 16진수 111으로 저장


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

warning - array subscript has type `char'  (0) 2010.01.06
extern  (0) 2009.07.02
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
반응형

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

extern  (0) 2009.07.02
BCD(binary Coded Decimal)  (0) 2009.06.23
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
#define와 const 차이점  (1) 2009.05.05

+ Recent posts