once
pack
warning
#pragma warning (disable:4996) //2005의 deprecated에러를 무시한다.
를 추가한다면 경고자체를 띠우지 않을 수 있다. stdio.h 헤더파일에 추가 해버리자.-_-..경고짜증!!
프로그램 내에서 자주 사용하는 상수나 반복문을 또 쓰기 싫거나 const상수를 만들고 싶을때
#define 문을 써서 표현 하는것이 좋다.
지금 제일 많이 쓰는 #define MAX 100 이런 문장은 프로그램의 최대값을 변경 하고 싶을 때
용이하게 할 수 있다. 매크로 라는 기능으로도 유용한데 그건 아랫글 참고..
2007/03/20 - [Study/CNX] - 3.20(화) 스피커음 내보기. // 이전글넣기 플러그인 너무 좋다. ^_^
매크로 함수는 함수를 흉내 내서 인수를 받아들이고 매크로 실행 후 계산 결과를 리턴한다.
하지만 이 리턴하는게 말이 리턴이지 문장의 치환에 불과하다.
함수처럼 연산을 실행한 후에 결과값을 반환하는게 아니라는 것이다. (맨날 헷갈려ㅠ_ㅠ.)
#define dubae(i) i+i
#define double(i) i*i
#define VALUE 100
#define VALUE2 VALUE+100
두개의 매크로문으로 정확히 알 수 있는데
-dubae(3); 이라 하면 함수로 착각하여 -6으로 생각이 든다. 하지만 이건 매크로다. 단순히 문장내에
정의한 매크로를 치환해주는 역할만 해준다. 즉, -i+i; 라는 문장이 생기는 것이다.
double(3+3); 도 마찬가지로 6을 더한 후에 6*6이 될 거라고 생각하지만 아니다.
3+3 * 3+3 ; 으로 먼저 치환이 된다. 매크로문인 double을 먼저 치환해주고 연산을 해나가는 것이다.
전처리문을 보면 VALUE2가 200이라고 생각을 해버린다. 나 같은 사람은 이 순간 VALUE2는 200이라고
철썩 믿어버린다. 그럼 고정관념이 생겨서 오류가 나도 어디가 난지 죽어다 깨어나도 알지 못한다.
VALUE2*2+100 이런식으로 계산하면 500 하고 넘어가버리면 바로 버그가 탄생되는 것이다.
분명히 알아야 될 것은 매크로는 그저 문장내에 매크로에서 정의한 문장을 옮겨주는 역할만 한다.
그러므로 이 문장은 VALUE+100*2로 해석해야 정답이다. 결과값300이라는 값이 나오게 되는 것이다.
이를 방지하기 위해서 무조건 ( ) 로 묶어주는게 상책이다. -_-... 매크로로 들어간 문장이 최우선으로 계산하게
만들어 버려서 예상치 못한 실수를 원천방지 해버리자!!!