我可以从另一个c文件中的符号(函数)更改属性吗?

时间:2013-11-04 08:08:10

标签: c gcc weak-references pragma

我尽量保持这个尽可能简单(即使我有一个相关的问题在运行,但这应该更通用。

当我用一个原型声明一个函数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}})

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