2013-02-28 2 views
1

두 파일이 있다고 가정 해 봅시다 : stack.h 및 queue.h. 두 함수 모두 add() 함수를 구현하려고합니다. 예를 들어 stack.h와 queue.h를 같은 main.c에 포함하면 충돌이 발생합니다.C에서 이름 충돌을 방지하는 방법

두 파일 모두에서 add() 함수를 구현하는 데 권장되는 방법은 무엇입니까?

+1

, 그리고 모든 프로그래밍 언어로, 당신이 포함하는 모든 라이브러리는 수락 전용 이름을 가진 온전한 디자인이 있어야합니다

그런 다음이 작업을 수행 할 수 있습니다. 그렇지 않으면 모든 프로그래밍 언어에서 항상 충돌이 발생합니다. 예를 들어 행성에있는 모든 변수를 예약하는 "terribad.h"헤더를 포함하면 프로젝트 내에 "terribad.h"가 있는지 다시 생각해 볼 수 있습니다. – Dmitry

답변

2

이 같은 일부 처리기 트릭을 수행합니다

#define _STACK 
#define _QUEUE 

#ifdef _QUEUE 
#define add queue_add 
    #include "queue.h" 
#undef add 
#endif 

#ifdef _STACK 
#define add stack_add 
    #include "stack.h" 
#undef add 
#endif 

int main() 
{ 
    stack_add(); 
    queue_add(); 
} 

내 조언이다 - add 같은 일반적인 함수 이름 대신 명명 규칙이 아닌 충돌하는를 사용하는 코드베이스를 리팩토링 나머지는 subtract입니다.

객체 지향 프로그래밍 스타일의 팬이라면 전체 "추가", "수정"개념과 마찬가지로 큐와 스택 구조 내부에 함수 포인터를 사용하십시오.

#define TYPE int 

typedef struct tagStruct{ 
    TYPE *dataBuffer; 
    void (*add)(TYPE data); 
    void (*modify)(TYPE data, int index); 
    void (*deleteEverything)() 
}stack; 

init(stack) 방법,

이 그럼 당신은 ENTITIES보다는 무리로 stackqueue를보기 시작 (마찬가지로 대기열)에 이름 충돌이없는 다른 기능에 add(), modify()deleteEverything()를 할당 함수의. 다른 답변 말했듯이

stack stc; 
init(stc); /*sets up the function pointers*/ 
stc.add(10); 
stc.modify(30,0); 
stc.deleteEverything(); 
+2

그게 꽤 못생긴 데요 :) –

+0

예.하지만 KeithNicholas 예. stack과 queue가 정의되면, 그는 추한 것을해야 할 것이다. 그래서 그는'stack.h' 또는'queue.h'를 사용하는 코드의 다른 부분을 깨뜨리지 않습니다. –

+2

또한 오류가 발생하기 쉽습니다. –

5

순수한 C의 경우 가장 간단한 해결책은 적용 할 모듈 또는 데이터 구조의 이름과 관련된 함수에서 자체 서명 네임 스페이스를 사용하는 것입니다. 예 :

stack_add(...) 
queue_add(...) 

당신은 거의 모든 대형 순수 C 프로젝트에이의 예를 찾을 수 있습니다 : 이미 큐 및 테스트 스택 구현을 가지고 있고, 다른 곳에서 언급하는 경우 당신이 할 수있는 ...

pthread_mutex_lock() // POSIX/UNIX, used for locking a mutex 
CGRectMake()   // iOS, used to fill in a CGRect structure 
RtlZeroMemory()  // WinNT, "Rtl" indicates the module it belongs to 
+0

IMHO 다소 과잉이지만 C 네임 스페이스에 대한 아이디어를 보려면이 질문을 참조하십시오. http://stackoverflow.com/questions/389827/namespaces-in-c – congusbongus

관련 문제