C语言 带有单文件头库的弱函数

ruyhziif  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(105)

我维护rawdraw,rawdraw使用全局符号来回调,用于创建,输入和关闭。我想自动使用一个符号的副本,比如说,如果用户没有定义一个,或者如果用户定义了一个,我想使用它。
这对大多数平台来说都不是问题,但对于Android来说,这是非常烦人的,因为在应用程序在设备上运行之前,您无法识别链接器问题。
问题是这是在标题中。所以我想要的是一种方法,从同一个C文件,允许函数调用被覆盖,但不需要它。
我尝试了weakweak,aliasof(...)属性,似乎都不允许在同一个C文件中覆盖符号。
例如,在这种情况下,用户希望允许检测窗口终止,但该库的许多用户并不关心。
cnfg.h

void HandleWindowTermination();

...

    case APP_CMD_TERM_WINDOW:
              ...
        HandleWindowTermination();
        break;

将要求用户实现HandleWindowTermination()-但我想有一个可选的实现它。

void DefaultHandleWindowTermination() { } // Do nothing

这只在HandleWindowTermination()从未定义时使用。

wlp8pajw

wlp8pajw1#

GCC“weak”属性并非对所有目标都可用。关于GCC manual
此属性需要汇编程序和对象文件支持,可能并非在所有目标上都可用。
因此,您可能需要使用变通方法。一种可能性是定义一个指向可选实现的函数指针:

typedef void (* HandleWindowTerminationFuncType) ();
   HandleWindowTerminationFuncType HandleWindowTerminationFunction = NULL;

   static void HandleWindowTermination()
   {
       if(HandleWindowTerminationFunction != NULL)
       {
           HandleWindowTerminationFunction();
       }
       else
       {
           // Default action
       }
   }

然后,另一个模块可以实现一个HandleWindowTermination()函数,并将HandleWindowTerminationFunction指针设置为指向该实现(您可以实现一个“setter”函数来实现)。

相关问题