2010-05-24 3 views
23

내 파일에 const 문자를 아래와 같이 추가했습니다. 내가 얻을 오류는 중복 기호 _xyz (말)입니다. 그것의 문제점은 무엇이며 어떻게이 문제에서 벗어날 수 있습니까? 이 헤더 파일에있는 경우중복 기호 오류 C++

const char* xyz = "xyz"; 
class Abc 
{ 
public: 
    Abc() 
    { 
    } 
}; 

답변

37

, 당신은 때마다 당신에게 #includexyz을 정의하고 있습니다.

@R Samuel Klatchko가 보여주는대로 선언을 변경할 수 있습니다. 일반적인 방법 (데이터가없는 경우 const)이 같다 : Abc.h에서

: Abc.cpp에서

extern char *xyz; 

:

char *xyz = "xyz"; 

편집

을 추가 할 수

헤더 가드는 이 아니며은이 문제를 해결합니다.

#ifndef XYZ_H 
#define XYZ_H 
... 
#endif 

헤더 가드는 동일한 심볼이 같은 컴파일 장치에 두 번 나타나는 "재정의"오류를 방지합니다. 그건 컴파일러 오류입니다.

그러나 헤더 가드 인 경우에도 xyz의 정의는 해당 파일을 포함하는 모든 소스 파일에 계속 나타나며 링커 오류 인 "중복 심볼"오류가 발생합니다.

원래 포스터가 언급 한 경우 더 도움이되었을 것입니다.

+0

변수를 여러 번 선언하는 것은 동일한 변환 단위 내에 있지 않으면 오류가 아닙니다. 그것을 정의하는 것입니다. –

+0

나는 그것을 붙잡아 야했다, 고마워. – egrunin

+1

헤더 가드 설명에 감사드립니다. 하지만 이상한 일이 있습니다. 헤더에 정의 된 함수가 있으면 중복 된 심볼에 대해서만 링커 오류가 발생합니다. 내 현재의 경우에는 여러 개의 상수와 두 개의 함수가 헤더 내의 네임 스페이스에 정의되어 있습니다. 함수에 대한 링커 오류 만 가져오고 const는 괜찮습니다. 왜 그런가요? –

-9

문제의 의미있는 설명을 제공해주십시오. "내 파일"은 무엇입니까? 무슨 "const 문자"당신에 대해 복용하고 있습니까?

지금까지 제공 한 내용에 대해 위의 정의 xyz을 헤더 파일에 추가 한 다음 여러 번역 단위에 포함 시켰다고 추측 할 수 있습니다. 결과 : 객체 xyz이 두 번 이상 정의되었습니다. 따라서 오류.

7

문제는 헤더 파일을 포함하는 모든 소스 파일이 외부 연결을 사용하여 xyz의 자체 복사본을 얻는 것입니다.

가장 쉬운 방법은 xyz 내부 연결을 제공하는 것입니다.

+0

+1 이상한 것은 가장 좋은 해결책입니다. 'const'는 항상 좋다. –

+3

const는 확실히 좋지만, 지금은 모든 파일에서 동일한 데이터의 인스턴스가 있다는 문제가 숨겨져 있습니다. –