我尽量保持这个尽可能简单(即使我有一个相关的问题在运行,但这应该更通用。
当我用一个原型声明一个函数extern void foo(void)
并在同一个C-File中调用它时,我可以在另一个C文件中为它赋予属性weak
吗?
原因是:extern
函数foo()
是否实现取决于某些构建选项,并且可能不会将OR添加到二进制文件中。如果不是,我(显然)得到错误undefined reference
。这就是为什么我要声明它很弱(来自GCC或__attribute__((weak))
的{{1}}。出于某种原因(这里需要解释)我想在单独的C文件中执行此操作,而不添加原始声明的#pragma weak
/ #pragma
? - 无论如何都要这样做?如果我只是将attribute
添加到其他C-File中它将无效。(我正在使用GCC 4.8.1)
//编辑:按要求提供一些代码:
注意:#pragma weak foo
的实施不链接到项目
Function.c
foo
WeakDeclaration.c
extern void foo(void);
// #pragma weak foo <-- If I add it here, it links without problems
void bar(void)
{
foo();
}
// EDIT2:
好的我会尝试更多地指出我的问题 - 有没有办法让链接器#pragma weak foo <-- If I add it here, I get undefined reference error
在另一个C-File中具有属性foo
全局可见weak
WeakDeclaration.c
1}})
答案 0 :(得分:1)
您可以使用包含的标题和宏命令切换编译指示:
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