我正在写一个库,有一些__weak
函数需要被程序员重写。我想确保他们这样做,所以我做了这个:
__weak void checkButtons(){
#warning "Implement this"
}
并将原型放在标题中:
__weak void checkButtons();
并在另一个文件中实现:
void checkButtons(){
//Some codes here
}
顺便说一句,问题是在编译时,编译器显示#warning
消息。
编译库.c.
library.c(8(:警告:#1215-D:#警告指令:消息";实现这个";
#"警告消息";实现这个";
库.c:1警告,0错误
我认为如果__weak
函数被重写,主函数就不应该被编译,应该是吗?
我不知道为什么会发生这种事。还有其他想法可以强迫用户吗?
主函数不应该编译,应该是吗?
所有内容都已编译。编译弱函数,编译正常函数。链接程序链接时,链接器选择符号的(编译的(正常版本,而不是符号的(也编译的(弱版本。链接发生在编译之后。
为什么会发生这种情况。
您已经在代码中编写了一个#warning
,它无论如何都将是可见的并由编译器处理,无论是否使用该函数。#warning
s在编译之前由预处理器进行解释。
如何强制用户实现__weak函数
首先,不要在头文件中使用weak
。它将使所有函数定义都变弱,从而查看此声明。
// header
void checkButtons();
其次,如果您想强制用户定义函数,那么不要使用weak
,也不要定义函数。当您希望为函数提供默认定义时,会使用弱符号,如果您不想这样做,则不要使用它。如果没有函数定义,用户将收到一个";未定义引用"-来自链接器的错误消息类型。
我正在写一个库,有一些函数需要被程序员重写
对于您的库来说,更好和正常的方法是获取指向库用户实现的函数的函数指针。这样的设计是";"更好"-允许代码重用,更容易进行单元测试,并在以后发生更改时节省大量重构。