#difine과 typedef 와 const 의 정의와 예제줌
1. #define
형식 : #define 이름 [내용]
내용은 생략가능합니다.
예:
#define _HUNIT1H_
이름: _HUNIT1H_
내용: 없음
#define MAX_SIZE 128
이름: MAX_SIZE
내용: 128
#define INCLUDESTD #include
이름: INCLUDESTD
내용: #include
#define SUB(a,b) ((a)-(b))
이름: SUB
내용: ((a)-(b))
메크로는 컴파일할 때 실제 컴파일 직전에, 사용된 위치에 메크로의 내용이 소스차원에서 그대로 대체됩니다.
INCLUDESTD /* #include
int main()
{
int arr[MAX_SIZE]; /* MAX_SIZE가 128로 대체됩니다. */
int i=1,j;
j = SUB(i,3); /* SUB(i,3)이 (i)-(3)으로 대체됩니다. */
}
메크로는 자칫 문제를 일으키기 쉽습니다.
#define SUB(a,b) (a-b)
int i=1,j;
j = SUB(i,5-1);
/* SUB(i,5-1)이 i-5-1로 대체됩니다. 즉, i-6으로 대체됩니다.
이는 원하는 바가 아니고 원하는 바는 i-4일 것입니다.
*/
2. typedef
typedef는 기본형에 없는 형을 새로 만들거나 기본형을 다른 이름으로도 사용하고 싶을 때, 구조체에 다른 이름을 붙이고 싶을 때 사용합니다.
형식1: typedef A 새로운형이름;
A 위치에는 기본형 또는 기본형을 조합한 것이 올 수 있습니다.
typedef unsigned int DWORD;
위와 같이 하면 DWORD 형은 unsigned int가 됩니다.
이 경우 아래 i,j는 같은 형입니다.
DWORD i;
unsigned int j;
typedef struct tagTestStruct{
멤버들;
}TESTSTRUCT;
이렇게 하면 아래 둘은 같은 구조체형입니다.
TESTSTRUCT st1;
struct tagTestStruct st2;
형식2: typedef int (*PointerToFuncType)(char*);
char* 매개변수 하나를 받아 작업한 후 int 값을 반환하는 함수에 대한 포인터 형 PointerToFuncType;
int Func1(char*str)
{
작업을 한 후 정수 반환
}
PointerToFuncType pFunc = Func1;
형식3: typedef int INT3TYPE [3];
int원소 3개로 이루어진 배열형
아래에서 a,b는 int 원소 3개를 갖는 배열입니다.
INT3TYPE a;
int b[3];
3. const
const는 상수를 선언/정의할 때 사용합니다.
const int i=3;
위와 같이 하면 이후 i=8;등과 같이 하여 i 값을 변경할 수 없습니다.
포인터가 개입된 상수는 상당히 복잡해질 수 있습니다.
int strlen1(const char *str)
{
이 곳에서 *str='a'; 또는 str[인덱스]='h'; 등과 같이 str이 가리키는 곳에 있는 값을 변경할 수 없습니다.
그러나 str=NULL;과 같이 포인터변수 자체의 값은 변경할 수 있습니다.
}
int strlen2(char * const str)
{
이 곳에서는 strlen1 함수와는 반대입니다.
*str='a'; 또는 str[인덱스]='h'; 등과 같이 str이 가리키는 곳에 있는 값을 변경할 수 있습니다.
그러나 str=NULL;과 같이 포인터변수 자체의 값은 변경할 수 없습니다.
}
int strlen3(const char const *str)
{
이 곳에서는 str 관련하여 아무것도 변경할 수 없습니다.
*str='a'; 또는 str[인덱스]='h'; 등과 같이 str이 가리키는 곳에 있는 값을 변경할 수 없습니다.
str=NULL;과 같이 포인터변수 자체의 값도 변경할 수 없습니다.
}
해석을 쉽게 하려면 const는 자신의 왼쪽에 있는 형에 적용되나 왼쪽에 형이 없으면 오른쪽 형에 적용된다고 보면 됩니다.
char const *str="abc"; 여기서 const의 왼쪽에 있는 것이 char이므로 char에 적용됩니다.
const char *str="abc"; 여기서 const의 왼쪽에 형이 없고 오른쪽에 있는 것이 char이므로 char에 적용됩니다.
char * const str="abc"; 여기서 const의 왼쪽에 있는 것이 * 이므로 *(포인터)에 적용됩니다.
const char * const str="abc"; 이 것은 위 둘의 조합입니다.
'C & C++ 관련' 카테고리의 다른 글
extern (0) | 2007.12.06 |
---|---|
Character Set과 Font (0) | 2007.10.20 |
World of Character Set (0) | 2007.10.20 |