//Assert()의 필요성.. 디버깅을 최대한 편하게..
// # 매크로에 대해서..-- 무슨 의미 일까? j 해당 심볼을 문자열로 풀어 달라.
// ## 매크로 - win 32 배울때 사용하게 됩니다.. token paste
// ### 없다
#include <stdio.h>
#define out( x ) printf("%d %d\n", x##1, x##2 );
void main()
{
int x1 = 10, x2 = 20;
out( x );
}
/*
#define dprint( x ) printf( #x " = %d\n",x);
void main()
{
int n =10;
dprint(n/2); //printf("n" " = %d\n",x,n);
pritnf("aaa" "bbb" "ccc"); //"aaabbbccc
}
*/
/*
//assert() 에 대하여 ...
// 1. 미리 정의된 매크로 3개 11번째 줄이 "printf("%d\n",__LINE__);"
// 2. c에 미리 정의된 매크로 : __FILE__,__TIME__,__LINE__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h> // assert() 매크로 함수를 제공해 준다.. 밑에 직접 만들었지만.. ㅡㅡ;;
/*매크로는 같은 줄에 있어야 함.. 그러나 다른 줄에 있으려면.
#define a \
10
*/
// 디버거 죽이면 어설트가 공백을 호출 하기 때문에..
// 프로그램 커지지 않음.. 개발 다 끝나면 디버거만 죽이면 가능..
//#define DEBUG
/*
#ifdef DEBUG
#define ASSERT( x ) if( !(x) ){\
printf("Assert Failed : %s(%d)\n",__FILE__,__LINE__);\
exit(-1);}
#else
#define ASSERT( x )
#endif
void foo (int age)
{
//개발시 디버깅을 편리하게 하기 위해 또는 함수 인자에 대해 ASSERT()를 수헁한따>
ASSERT(age >0);
printf("foo 실행 \n");
}
void main()
{
foo(-10); // 잘못된 인자.. 실행시 문제점 발견.
// 개발시 최대한 빨리 이곳이 잘못 되었다고 알아 내어야 한다.
}
*/
/*
#define DEBUG 주석 처리 하면.. ifdef 컴파일 안됨..
//A가 만든 코드 - 최대한 안전하게 만들자..
void foo(int age)
{
int * n;
// 개발 할때는 필요하지만 개발 끝나고 나면 필요 없음..
#ifdef DEBUG // 디버거가 있어야 컴파일 가능..
//--수정된 코드--//
if (age <= 0)
{
printf("foo : 잘못된 인자가 왔습니다. \n");
return;
}
//---------------//
#endif
n = (int *)malloc(sizeof(int) * age); // 나이만큼 메모리 할당
}
//B가 만든 코드
void main()
{
//깜빡하고 음수를 보냄
foo(-10);
foo(10);
}
*/
/*
void main()
{
printf("%s\n",__FILE__);
printf("%s\n",__TIME__);
printf("%d\n",__LINE__);
}
*/
//---------------------------------------------
/*
//c에서의 다양한 에러 처리 기법들
// extern "c" cpp => c 컴파일로 처리
// cafe.naver.com/cppmaster C/C++ 메뉴에 보시면 flexible array관한
// 설명이 있씁니다.. 시간 날때 읽어 보세요..
int foo() //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{
FILE* f = 0;
char* buf = 0;
int n = 0;
int ret = -1; //단일 함수 내에서 에러 처리를 위해 사용하는 goto는 실제 많이 사용하는 기법.
f = fopen(...);
if( f == 0 ) goto ERR:
buf = (char*)malloc(sizeof(100));
if(buf == 0) goto ERR:
n = fread(...);
if( n <= 0 ) goto ERR:
// 성공 buf 사용.
ret = 1;
ERR:
//자원정리
if( f ) fclose( f );
if( buf ) free( buf );
return ret;//성공.
}
*/
/*
int foo() //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{ //one entry exit - if 가 성공인가를 조사.
FILE* f = 0;
char* buf = 0;
int n = 0;
int ret = -1; //실제로 초기화
f = fopen(...);
if( f != 0 )
{
buf = (char*)malloc(sizeof(100));
if(buf != 0)
{
n = fread(...);
if( n > 0 ) //성공
{
// 성공 buf 사용.
ret = 0;
}
free(buf);
}
fclose(f);
}
return ret;//성공.
}
*/
/*
int foo() //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{ //one entry multiple - if 가 실패를 조사.
FILE* f = 0;
char* buf = 0;
int n = 0;
f = fopen(...);
if( f==0 )//실패
return -1;
buf = (char*)malloc(sizeof(100));
if(buf == 0)//실패
{
fclose( f );
return -1;
}
n = fread(...);
if( n<=0 ) //실패
{
fclose(f);
free(buf);
return -1;
}
//성공, buf 사용
//자원 정리
fclose(f);
free(buf);
return -1; //성공.
}
*/
/*
// 대다수 c함수는 실패시 실패의 이유를 전역변수인 erron에 넣어 준다. !!
// errno(), strerror(),perror()
#include <stdio.h>
#include <stdlib.h>
#include <errno.h> // erron 을 사용 하기위해
#include <string.h>
void main()
{
FILE* f = fopen("a.txt","rt");
if(f == 0)
{
perror("Fail"); //""임의 문자를 출력하고 ":" 출력후 strerror(errno) 출력
printf("%d\n",errno);
printf("%s\n",strerror( errno ) );
printf("Fail \n");
}
}
*/
'프로그래밍' 카테고리의 다른 글
함수 및 포인터 (0) | 2009.07.19 |
---|---|
Flexible Array (0) | 2009.07.19 |
Dos Compilering & Make Asm (0) | 2009.07.19 |
Buffer OverFlow (0) | 2009.07.19 |
Asm Ex File (0) | 2009.07.19 |
댓글