2013-11-04 1 views
0

는 내가 (내가 관련된 질문이 실행되고 심지어 그래도 할 수있는 한 간단하게이를 유지하려고하지만 이것은 일반적인 가정된다.다른 c-File의 기호 (기능)에서 속성을 변경할 수 있습니까?

내가 프로토 타입과 함수 extern void foo(void)를 선언하고 같은에서 그것을 호출 할 때 C-파일, 나는 또 다른 C-파일에 그것을 속성 weak을 줄 수

이유는 이것이다 :?. foo()이 구현되는 extern 기능은 일부 빌드 옵션에 따라 달라거나 바이너리에 추가 할 수 없습니다 여부 경우 그것은 분명히 오류 undefined reference을 얻게 되었기 때문에 GCC에서 __attribute__((weak)) 또는 #pragma weak을 사용하여 약하게 선언하려고합니다. 웬일인지 (여기서 설명하기를 갈망합니다) 원래 선언에 #pragma/attribute을 추가하지 않고 별도의 C 파일에서이 작업을 수행하고 싶습니다. - 어쨌든 이걸 할 수 있을까요? 난 그냥 #pragma weak foo anothr C- 파일에 추가하면 작동하지 않습니다. 프로젝트

Function.c

extern void foo(void); 
// #pragma weak foo <-- If I add it here, it links without problems 

void bar(void) 
{ 
    foo(); 
} 
하지을 연결 foo의 구현입니다 :

// 편집 (나는 GCC 4.8.1를 사용하고 있습니다) : 몇 가지 코드를 요청한 : 주

WeakDeclaration.c

#pragma weak foo <-- If I add it here, I get undefined reference error 

// EDIT2 :

가 좋아 난 그렇게 내 질문을 지정하려고거야 더 비트 - (WeakDeclaration.c)

+0

설명이 혼란 스럽습니다. 일부 코드를 보여주십시오. 또한 * "작동하지 않을 것"*이라는 의미를 정의하십시오. – user694733

+0

함수를 호출하거나 참조 하시겠습니까? 만약 그렇다면, 나는 당신이 그것 없이는 가끔씩 만들 것을 기대할 수있는 방법을 전혀 이해하지 못한다 ... – unwind

답변

1

당신이 할 수있는 또 다른 C-파일 내에서 속성 weak와 링커에 전 세계적으로 볼 기호 foo을 할 수있는 방법이

Function.c :

#include "weak.h" 
... 
extern void foo(void); 
#ifdef TURN_ON_WEAK 
#pragma weak foo 
#endif 

weak.h :

,174는 포함 된 헤더와 매크로 명령을 사용 프라그 전환
#ifndef MY_WEAK_H 
#define MY_WEAK_H 

#define TURN_ON_WEAK 

#endif 
+0

내가 생각하고 있던 해결책이 맞다.하지만 그렇게 할 수있는 방법이 있는지 궁금해하고 있었다. # ifdef '모든 파일에서 함수를 약하게 선언하고 싶습니다. – Toby

+0

플러그인을 두 번 이상 사용할 수 있습니까? 그렇다면 extern 선언과 pragma를 하나의 헤더 파일에 둘 수 있습니다. 그리고 어떤 파일 (함수 본문이있는 파일)에서 프라그 마를 선택적으로 비활성화하려면 파일을 포함하기 전에'#define TURN_OFF_WEAK'을 넣고 포함 파일 내부에 ifdef 조건을 넣을 수 있습니다 – nio

+0

해결책이 될 것입니다. 내가 찾고있는 것은 'weak'선언을 다른 파일에서 완전히 독립적으로 만드는 방법과 같다. (내 질문에 edit2를 보라) – Toby

관련 문제