0

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

当我声明一个extern void foo(void)带有原型的函数并在同一个 C 文件中调用它时,我可以weak在另一个 C 文件中赋予它属性吗?

原因是:该extern功能foo()是否实现取决于一些构建选项,可能会或可能不会添加到二进制文件中。如果不是,我(显然)得到一个错误undefined reference。这就是为什么我要声明它是弱的(__attribute__((weak))来自 GCC 或 with #pragma weak。出于某种原因(在这里解释很长)我想在单独的 C 文件中执行此操作,而不在原始声明中添加#pragma/ attribute? - 有无论如何要这样做?如果我只是添加#pragma weak foo到另一个 C-File 它不会工作。(我使用的是 GCC 4.8.1)

//编辑:根据要求一些代码:注意:实现foo与项目无关

函数.c

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

void bar(void)
{
     foo();
}

弱声明.c

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

//编辑2:

好的,我会尝试更多地指定我的问题 - 有没有办法使符号foo对链接器全局可见,并且具有weak来自另一个 C 文件(WeakDeclaration.c)中的属性

4

1 回答 1

1

您可以使用包含的标头和宏命令切换编译指示:

函数.c:

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

弱.h:

#ifndef MY_WEAK_H
#define MY_WEAK_H

#define TURN_ON_WEAK

#endif
于 2013-11-04T08:30:52.800 回答