티스토리 뷰
gcc 컴파일러에서 #define 문을 따로 헤더파일로 만들어, 여러 파일에서 사용한다.
| #pragma once #ifndef define_H #define define_H #ifndef countof #define countof(a) (sizeof(a)/sizeof(a[0])) #endif #ifndef DEF_byte1 #define DEF_byte1 #define byte1 unsigned char #define byte2 unsigned short #define byte4 unsigned long #endif #ifndef MAX_PATH #define MAX_PATH 128 #endif #endif//define_H |
언뜻보기에는 문제가 없어야하지만, 실제로는 아래와 같은 에러들이 나온다.
원인은 무엇이고, 해결방법은 어떻게 되는가?
(기본적인 내용이지만, 이런일이 종종 발생하여 시간을 허비하는 경우가 있다)
| two or more data types in declaration specifiers define.h:12:16: error: duplicate ‘unsigned’ |
일반적인 해결방법
'#define'은 C 프로그램에서 매크로를 정의하는 데 사용되는 전처리 지시어입니다.
'#define'을 사용하면 코드 내에서 특정한 토큰 또는 식을 지정된 텍스트로 대체할 수 있습니다.
중복 정의 문제는 동일한 심볼이 이미 정의되어 있다는 경고나 에러를 의미합니다.
중복 정의 문제를 해결하는 몇 가지 방법이 있습니다:
1. 조건부 컴파일 (Conditional Compilation) '#ifndef', '#define', '#endif' 등을 사용하여 이미 정의된 매크로를 다시 정의하기 전에 해당 매크로가 정의되어 있는지 확인할 수 있습니다. 이를 통해 중복 정의를 방지할 수 있습니다.
| #ifndef MY_MACRO #define MY_MACRO 42 #endif |
2. '#pragma once' 일부 컴파일러는 '#pragma once'를 지원하여 특정 헤더 파일이 한 번만 포함되도록 보장합니다. 이를 사용하면 중복 정의 문제를 방지할 수 있습니다.
| #pragma once #define MY_MACRO 42 |
3. 헤더 파일 가드 (Header Guards) 헤더 파일에서 중복 정의를 방지하기 위해 헤더 가드를 사용할 수 있습니다. 이는 헤더 파일의 내용이 이미 포함되어 있는지 확인하여 중복 포함을 방지합니다.
| #ifndef HEADER_FILE_H #define HEADER_FILE_H // 헤더 파일의 내용 #endif |
4. '#undef' 필요에 따라 이미 정의된 매크로를 해제할 수 있습니다. 하지만 주의가 필요하며, 코드가 복잡해질 수 있습니다.
| #ifdef MY_MACRO #undef MY_MACRO #endif #define MY_MACRO 42 |
5. 이름 변경 중복 정의 문제를 피하기 위해 매크로의 이름을 변경할 수 있습니다.
| #define MY_MACRO_A 42 #define MY_MACRO_B 42 |
중복 정의 문제를 해결하는 방법은 상황에 따라 다를 수 있으며, 위에서 제시한 방법 중 하나를 선택하여 사용하면 됩니다. 선택한 방법은 코드의 특정 상황 및 요구에 맞게 조절될 수 있습니다.
이번 경우의 문제 원인
다른 라이브러리에서 사용하고 있었음.
| typedef struct { /* normal 16 bit characters are two bytes */ unsigned char byte1; unsigned char byte2; } XChar2b; |
이런 경우, 에러메세지만으로는 알기가 어려움.
"잘쓴던 코드인데, 왜 에러가 나지?"
이번문제는 그동안 많이 사용한 byte1을 포기할 수 없어,
byte1을 구조체 맴버이름으로 사용하는 라이브러리를 위에 include하고,
내 define.h파일을 그 다음에 include하여 해결이 되었음.

