2014-06-19 4 views
1

동일한 이름의 전역 변수가 3 개있는 두 개의 파일 ".h"를 사용하고 있습니다.글로벌 변수 사이의 충돌 c/C++

우리는이 파일을 가지고 가정 :

  • A.h => 내부 그것은 "노조 VAR1", "노조 VAR2"와 "#DEFINE 길이 (20)는"이 있습니다.
  • B.h => 내부에는 "union var1", "union var2"및 "#define LENGTH 60"이 있습니다.
  • C.h =>는 A.h와 B.h를 모두 가져옵니다.

내가 C.h를 컴파일하면 동일한 변수 이름에 대해 충돌이 발생합니다.

공용 라이브러리 내부에 있기 때문에 이름을 수정하고 싶지 않습니다. 그대로 사용하고 싶습니다. 이것이 내 문제입니다. 누군가 나를 도울 수 있습니까? 감사.

+0

일부 코드 스 니펫을 게시 할 수 있습니까? –

+0

이 태그에'c'와'C++ '태그를 붙이면 좋은 대답을하기가 매우 어려워집니다. 어느 언어에 대해 묻고 있습니까? –

+0

@DavidSchwartz, C++ 실제로. –

답변

1

먼저 헤더 파일 (".h")은 컴파일되지 않으며 엄격하게 말해서 When I compile C.h과 같은 것이 없습니다. 오직 .cpp 파일들, 물론 에는이 포함됩니다.이 헤더 파일들은 컴파일됩니다.

둘째, 동일한 이름의 다른 변수를 참조하는 두 개의 헤더 파일을 프로그램에 포함해야하는 경우 두 번째 헤더 파일에 잘못된 디자인 문제가있을 수 있습니다.

셋째, 유니온의 이름을 정의 할 필요가 있다고 생각합니다 (?, 노조는 사용하지 말아주세요).

// A.h 
namespace aa { 
    union myType { int m1; float m2; } 
    myType var1; 
} 

:

그렇지 않으면, 솔루션은 두 개의 구별하기 서로 다른 네임 스페이스를 정의 할 수 있습니다.

// B.h 
namespace bb { 
    union myType { int m1; float m2; } 
    myType var1; 
} 

.

// C.cpp 
#include "A.h" 
#include "B.h" 

... 
    aa::var1.m1 = 1; 
    bb::var1.m1 = 2; 
+0

구문 오류 :-) – juanchopanza

+0

@juanchopanza는 자유롭게 생각할 수 있습니다. 당신은 생각을 가지고 있습니다 ... ;-) – kebs

+1

글쎄, 당신이 대답을 올리면, _you_는 정확한 구문을 얻습니다! –

6

단일 파일에 두 헤더 파일을 모두 포함 할 필요가 없도록 각 공용 라이브러리를 격리하십시오. 파일은 하나의 라이브러리를 사용하거나 다른 라이브러리를 사용할 수 있지만 둘 다 사용할 수는 없습니다. 다른 라이브러리를 사용하는 코드에서 직접 라이브러리 대신 랩퍼를 사용하거나 랩핑하는 것이 가장 쉬운 라이브러리를 랩핑하여 필요한 기능에 대한 랩퍼를 작성해야합니다.

+0

그래,하지만이 "래퍼"에 대한 몇 가지 예를 보여줄 수 있습니까? 나는 이해할 수 없다! –

+0

"래퍼"는 하나 이상의 다른 기능 (이 경우 라이브러리의 기능)을 호출하는 기능입니다. 래퍼 함수와 매개 변수는 자체 헤더 파일에 정의됩니다. 따라서 문제를 일으키는 헤더 파일을 포함해야하는 래핑 된 함수를 호출하는 대신 모든 래퍼 함수를 ​​호출해야합니다. 기본적으로 랩퍼는 완전히 다른 인터페이스 (이 경우 사용자가 디자인 할 수있는 인터페이스)와 동일한 기능을 제공합니다. –

0

이 시도 :

LIB_FILE.H

extern union_type var1; // declaration 
extern union_type var2; // declaration 

LIB_FILE.cpp

union_type var1; // definition 
union_type var2; // definition 

파일 A.H

#include "LIB_FILE.H" 

FILE B.H

#include "LIB_FILE.H" 

FILE C.H

#include "A.H" 
#include "B.H" 

전역 변수의 정의와 선언을 구별해야합니다.