티스토리 뷰

반응형

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하여 해결이 되었음.

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함