- HOME
- Post in | c/c++
- Post at | 2013. 1. 30. 12:00 | by 밀크빵.
- View comment
const 과 #define
① #define이 정의하는 매크로 상수는 타입을 지정할 수 없지만 const는 타입을 명확하게 지정할 수 있다. 위 예에서 Day는 실수 24.0이나 문자열 "24"가 아닌 정수형의 24라는 것을 분명하게 지정한다. C++은 타입을 중요시하기 때문에 상수의 정확한 타입이 의미를 가지는 경우가 있다.
② 매크로 상수는 일단 정의된 후에는 언제든지 어느 곳에서나 사용할 수 있지만 const는 통용 범위 규칙의 적용을 받기 때문에 자신이 선언된 범위 내에서만 사용할 수 있다. 함수 내부에서 선언한 상수는 함수 내부에서만 사용할 수 있으며 함수 밖으로는 알려지지 않는다. 즉, 지역 상수를 만들 수 있으며 명칭간의 충돌을 최소화할 수 있다.
③ #define은 컴파일러가 아닌 전처리기에 의해 치환되기 때문에 실제 소스에는 매크로가 치환된 상태로 실행된다. 그래서 디버깅 중에 매크로 상수의 값을 확인해 볼 수 없으며 아무리 간단한 버그라도 확인이 안되면 잡기가 어렵다. 반면 const 상수는 컴파일러가 처리하기 때문에 디버깅 중에도 값을 확인해 볼 수 있어 복잡한 단계를 통해 정의된 상수의 값도 쉽게 살펴볼 수 있다.
④ 매크로는 기계적으로 치환되기 때문에 부작용이 발생할 소지가 많다. 괄호를 싸지 않으면 연산 순위에 의해 예상하지 못한 값이 될 위험이 있다. 그러나 const 상수는 컴파일러가 문맥에 맞게 처리하므로 이런 부작용이 거의 없다. #define A 1+2의 A는 3이 될 가능성이 있을 뿐 주변 연산문에 따라 3이 아닐 수도 있지만 const int A=1+2;는 어떤 경우라도 3이다.
=======================================================================================================
함수 포인터 사용 하는 것이 좋을 때
① 선택해야 할 함수가 두 개 이상인 경우, 예를 들어 수십개의 함수중 하나를 호출해야 한다면 함수 포인터 배열을 선언하고 그 첨자를 선택하는 것이 더 쉽다.
② 함수를 선택하는 시점과 실제로 호출하는 시점이 완전히 분리되어 있는 경우도 함수 포인터를 쓰는 것이 유리하다. 호출할 함수에 대한 조건 점검은 필요할 때 한 번만 하고 선택된 함수는 별다른 조건 점검없이 함수 포인터로 바로 호출할 수 있다.
③ 호출할 함수가 DLL같은 외부 모듈에 있고 이 함수를 동적으로 연결할 경우는 컴파일할 때 함수의 존재가 알려지지 않으므로 반드시 함수 포인터를 사용해야 한다. 함수 포인터를 사용하면 이름으로부터 원하는 함수의 번지를 찾아 호출할 수 있다.
'c/c++' 카테고리의 다른 글
ip/ mac 주소 얻기 (0) | 2013.02.25 |
---|---|
서비스 (0) | 2013.02.25 |
구조체 (0) | 2013.01.30 |
함수에서 값을 반환하는 방법 (0) | 2013.01.18 |
CAtlArray 예제 (0) | 2013.01.10 |