2013-11-04 69 views
0

我儘量保持這個簡單,我可以(甚至壽我有一個相關的問題跑,但是這應該是比較一般。我可以在另一個c-File中更改符號(函數)的屬性嗎?

當我宣佈一個功能extern void foo(void)有原型,並調用它在同C-文件,我可以給它的屬性weak在另一個C-文件

原因是這樣的:?是否extern功能foo()實現依賴於一些編譯選項,並可能會或可能不會被添加到二進制如果這不是,我得到(顯然)錯誤undefined reference。這就是爲什麼我要聲明它很弱(來自GCC的__attribute__((weak))#pragma weak。出於某種原因(要在這裏解釋)我想在單獨的C-File中完成此操作,而不在原始聲明中添加#pragma/attribute? - 有沒有辦法做到這一點?如果我只是將#pragma weak foo添加到anothr C文件中,它將不起作用。 (我用GCC 4.8.1)

//編輯:根據要求一些代碼: 注:foo的實現鏈接到項目

Function.c

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

void bar(void) 
{ 
    foo(); 
} 

WeakDeclaration.c

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

// EDIT2:

好吧,我要去嘗試使指定我的問題多一點 - 有沒有辦法從另一個C-文件中(WeakDeclaration.c

+0

您的解釋令人困惑,請顯示一些代碼。還要定義你的意思*「它不會工作」*。 – user694733

+0

你是否打電話或以其他方式引用該功能?如果是這樣的話,我完全不理解你可能期望如何在沒有它的情況下構建... – unwind

回答

1

可以使符號foo與屬性weak鏈接全局可見

Function.c:

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

weak.h:

使用包括報頭和宏命令切換編譯
#ifndef MY_WEAK_H 
#define MY_WEAK_H 

#define TURN_ON_WEAK 

#endif 
+0

是的,這就是我正在考慮的解決方案,但我真的想知道是否有辦法這樣做, #ifdef'在我想聲明一個函數弱的每個文件中。 – Toby

+0

是否可以多次使用該雜注?如果是的話,你可以把extern聲明和編譯指示放到一個頭文件中。如果你想有選擇地禁用某個文件中的編譯指示(這個文件帶有函數體?),你可以在包含文件之前加上'#define TURN_OFF_WEAK',並在你的包含文件中包含ifdef條件。 – nio

+0

這將是一個解決方案 - 但我在尋找的東西更像是一種使「弱」聲明在另一個文件中完全獨立的方法(請參閱我的問題中的edit2) – Toby

相關問題