如何强制用户实现 __weak 功能

How to force user implement __weak functions

我正在编写一个库,并且有一些 __weak 函数需要由程序员覆盖。我想确保他们这样做,所以我这样做了:

__weak void checkButtons(){
    #warning "Implement this"
}

并将原型放在header:

__weak void checkButtons();

并在另一个文件中实现:

void checkButtons(){
    //Some codes here
}

顺便说一句,问题是在编译时,编译器显示 #warning 消息。

compiling library.c...

library.c(8): warning: #1215-D: #warning directive: message "Implement this"

#warning message "Implement this"

library.c: 1 warning, 0 errors

我觉得如果一个__weak函数被覆盖了,main函数应该不会被编译,应该是?

我不知道为什么会这样。还有其他强制用户的想法吗?

the main function should not be compiled, should be?

一切都编译好了。编译弱函数,编译正常函数。链接器在链接程序时选择(已编译的)正常版本的符号而不是(也已编译的)弱版本的符号。链接发生在编译之后。

why this happens.

您已经在代码中编写了一个 #warning,它无论如何都会被编译器看到和处理,与是否使用该函数无关。 #warning 由预处理器解释, 编译之前。

How to force user implement __weak functions

首先,不要在头文件中使用weak。看到这个声明会使 all 函数 definitions 变弱。

// header
void checkButtons();

其次,如果你想强制用户定义函数,那么不要使用weak并且不要定义函数。当您想要 为函数提供默认定义时使用弱符号,如果您不想这样做,则不要使用它。如果没有函数定义,用户将从链接器收到类似“未定义引用”的错误消息。

I'm writing a library and have some functions which need to be overwritten by the programmers

然而,更好和正常的方法是让您的库采用指向您的库用户实现的函数的函数指针。这样的设计“更好”——允许代码重用,更容易进行单元测试,并在以后更改的情况下节省大量重构。