gcc 具有允许创建弱符号(如函数)的__attribute__((weak))
。这允许用户重新定义函数。我想在 XC8 中拥有相同的行为。
更多信息:
我正在为 XC8 编写驱动程序,我想将低级初始化委托给用户定义的函数。
我知道可以重新定义一个函数:在 XC8 的源文件中实现了putch
函数,并由 printf 函数调用。允许用户在其应用程序中重新实现putch
。有两个同名的函数,但不引发错误。
putch
在 XC8 源文件中的实现有一条注释说"弱实现。可能需要用户实现",因此必须有可能。
我在 XC8 的用户指南中查看了编译指示,但没有与此问题相关的指令。
链接器将仅搜索静态库以解析输入对象文件尚未解析的符号,因此可以在没有弱链接的情况下替换静态库函数。 弱链接对于作为源代码或目标代码而不是静态库提供的代码很有用。
因此,如果不支持弱链接指令,则可以为"弱"符号创建一个静态库并链接该函数库。
XC8 手册记录了 IAR 兼容性指令__weak
和weak
杂注的行为,在这两种情况下,指令都被忽略(仅在 XC16 和 XC32 中支持),因此您将不得不使用上述建议的方法,该方法在任何情况下都更具可移植性 - 如果有些不方便。
就putch()
而言,我怀疑这并不像您认为的那样有效。我想,这根本不是一个薄弱联系的问题;相反,这是一个薄弱环节的问题。在包含printf()
的静态库中存在指向putch()
的未解析链接,链接器使用您提供的任何内容对其进行解析;如果您要从源代码编译和链接Microchip实现和链接您的实现,则会出现链接器错误;同样,如果您不提供任何实现,则会收到链接器错误。
XC8编译器确实支持"weak"属性。
weak 属性会导致声明作为弱符号发出。弱符号表示如果同一符号的全局版本可用,则应改用该版本。当弱属性应用于对外部符号的引用时,链接不需要该符号。
例如:
extern int __attribute__((weak)) s;
int foo(void)
{
if (&s)
return s;
return 0; /* possibly some other value */
}
在上面的程序中,如果 s 没有被其他模块定义,程序仍将链接,但 s 不会被赋予地址。 条件验证 s 是否已定义(如果有,则返回其值)。否则返回"0"。 此功能有许多用途,主要用于提供可与可选库链接的泛型代码。
变量也可以使用"弱"属性进行限定。
例如:
char __attribute__((weak)) input;
char input __attribute__((weak));