혹시, 전처리 연산자 #을 아십니까? C언어 개발자 중에서 #이 별도의 연산자라는 것을 모르는 분이 너무 많습니다.
#은 #include, #if, #define에 앞에 붙여서 전처리기임을 표시하는 데 사용하는 것 아냐? 라고 얘기를 합니다. 그러면 ## 연산자는 알고 있나요? ##은 또 뭐야? 머리가 더 아픕니다.
#과 ## 연산자는 주로 #define으로 매크로 함수나 매크로 정의 시에 많이 사용합니다.
#연산자
#연산자는 문자열로 변환하는 연산자입니다.
Example 1. 정수형 데이터를 출력시 자동으로 변수명과 값을 출력하는 예제
#define PRINT_INT(a) printf("%s: %d\n", #a, a)
사용예)
int count = 100;
PRINT_INT(count);
결과:
count: 100 <-- count라는 변수가 문자열로 출력되었습니다.
이해가 되시나요?
위의 경우 #연산자를 모르면
printf("%s: %d\n", "count", count);
라고 해야겠지만, #연산자로 변수명을 자동으로 문자열화 할 수 있습니다.
Example 2.
#define _CALL_TRACE(func) \
printf("%s is started...\n", #func); \
func; \
printf("%s is finished.\n", #func)
사용예)
_CALL_TRACE(ret = file_create(filename));
결과:
ret = file_create(filename) is started....
//이부분은 file_create(filename)이 로그를 찍어서 출력되는 부분
ret = file_create(filename) is finished...
위의 모양을 file_create() is started... 로 찍고 싶을 때에는 문자열을 넣으면 함수명을 return해주는 함수를 하나 만들어서 사용하면 됩니다.
char *func_name(const char *func_call); 이 함수가 func_name() 형태의 문자열을 return 한다면.
Example 3.
#define _CALL_TRACE(func) \
printf("%s is started...\n", func_name(#func)); \
func;\
printf("%s is finished.\n", func_name(#func))
사용예)
_CALL_TRACE(ret = file_create(filename));
결과:
file_create() is started....
//이부분은 file_create(filename)이 로그를 찍어서 출력되는 부분
file_create() is finished...
위와 같이 TRACE 로그를 한방에 해결할 수 있습니다.
## 연산자
##연산자는 이름 연결 연산자입니다. 참 설명하기 힘드네요. 예를들어 설명하겠습니다.
#define _DEFINE_GETSET(type, var_name) \
type get##var_name(void) \
{ \
return var_name; \
} \
void set##var_name(type _##var_name) \
{ \
var_name = _##var_name;
}
사용 예).
_DEFINE_GETSET(int, Age)
// 세미콜론 안붙임.
결과:
int getAge(void)
{
return Age;
}
void setAge(int _Age)
{
Age = _Age;
}
를 코딩한 것 과 같습니다.
#, ## 연산자는 주로 솔루션이나 개발툴을 개발하는 경우에 종종 사용 합니다.
Visual C++의 MFC 라이브러리에서 상속관계를 문자열로 표시하거나 class에 따른 변수명을 자동으로 만들기 등 많이 사용합니다.
defined 연산자
defined 연산자는 #define이나 Compiler에서 설정한 default 매크로, -D 컴파일 옵션을 통한 매크로 정의 여부를 검사하는 연산자입니다.
#if defined(_DEBUG)
는 #ifdef _DEBUG와 같은 의미입니다.
#if !defined(_DEBUG)
는 #ifndef _DEBUG와 같은 의미입니다.
그러면, #ifdef 나 #ifndef가 있는 데, 굳이 define 연산자는 왜 만들었을까요? 그것은 defined 연산자를 이용하면 두가지 이상의 조건을 논리 연산을 통하여 사용할 수 있습니다.
#if defined(_DEBUG) && defined(_WINDOWS)
...
#endif
처럼 사용할 수 있습니다.
C Programming Language 문법
1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..
www.it-note.kr
'C언어 > 문법' 카테고리의 다른 글
C Programming Language 문법 (11) | 2019.12.08 |
---|---|
34. 전처리기(Preprocessor) - Debugging 등을 위한 예약어 (1) | 2019.12.08 |
33. 전처리기(Preprocessor) - 조건부 컴파일 (0) | 2019.12.08 |
32. 전처리기(Preprocessor) - 기초 (0) | 2019.12.08 |
31. 열거형(enum) - 정수형 상수 그룹 (0) | 2019.12.07 |