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
#difine과 typedef 와 const 의 정의와 예제줌  (0) 2007.10.22
Character Set과 Font  (0) 2007.10.20
World of Character Set  (0) 2007.10.20
Posted by Real_G

댓글을 달아 주세요