- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我可能对 weak 理解有误:
我的情况:
phy.h
#pragma once
void phyStuff(void);
// new callback for higher layer
void __attribute__((weak)) phy_cb();
phy.c
#include <stdlib.h>
#include <stdio.h>
#include "phy.h"
// Callback, weak
void phy_cb() {
printf("phy_cb, default implementation. BAD!!!\n");
}
void phyStuff(void) {
printf("PHY stuff. Running phy_cb.\n");
phy_cb();
}
frm.h
#pragma once
#include "phy.h"
void frmStuff(void);
// new callback for higher layer
void __attribute__((weak)) frm_cb();
frm.c
#include <stdio.h>
#include "phy.h"
#include "frm.h"
// implement the callback
void phy_cb() {
printf("phy_cb, FRM implementation. GOOD\n");
}
// Callback, weak
void frm_cb() {
printf("frm_cb, default implementation. BAD!!!\n");
}
void frmStuff(void) {
printf("FRM stuff. Running frm_cb\n");
frm_cb();
}
main.c
#include <stdio.h>
#include "frm.h"
#include "phy.h"
void frm_cb() {
printf("frm_cb, APP implementation. GOOD\n");
}
void main(void) {
printf("Main.\n");
phyStuff();
frmStuff();
}
现在,如果我编译它...
$ gcc main.c phy.c frm.c
$ ./a.out
Main.
PHY stuff. Running phy_cb.
phy_cb, default implementation. BAD!!! <--- not expected!
FRM stuff. Running frm_cb
frm_cb, APP implementation. GOOD
为什么在这种情况下没有覆盖弱符号?有什么解决方法吗?
最佳答案
您应该将 __attribute__((weak))
应用于实现,而不是原型(prototype):
phy.h
#pragma once
void phyStuff(void);
// new callback for higher layer
void phy_cb();
phy.c
#include <stdlib.h>
#include <stdio.h>
#include "phy.h"
// Callback, weak
__attribute__((weak)) void phy_cb() {
printf("phy_cb, default implementation. BAD!!!\n");
}
void phyStuff(void) {
printf("PHY stuff. Running phy_cb.\n");
phy_cb();
}
frm.h
#pragma once
#include "phy.h"
void frmStuff(void);
// new callback for higher layer
void frm_cb();
frm.c
#include <stdio.h>
#include "phy.h"
#include "frm.h"
// implement the callback
void phy_cb() {
printf("phy_cb, FRM implementation. GOOD\n");
}
// Callback, weak
__attribute__((weak)) void frm_cb() {
printf("frm_cb, default implementation. BAD!!!\n");
}
void frmStuff(void) {
printf("FRM stuff. Running frm_cb\n");
frm_cb();
}
main.c
#include <stdio.h>
#include "frm.h"
#include "phy.h"
void frm_cb() {
printf("frm_cb, APP implementation. GOOD\n");
}
void main(void) {
printf("Main.\n");
phyStuff();
frmStuff();
}
现在我们得到了想要的结果:
$ gcc main.c phy.c frm.c
$ ./a.out
Main.
PHY stuff. Running phy_cb.
phy_cb, FRM implementation. GOOD
FRM stuff. Running frm_cb
frm_cb, APP implementation. GOOD
为了更好地了解发生了什么,尝试分别编译源文件并查看每个对象中的符号:
$ gcc phy.c -o phy.o -c
$ gcc frm.c -o frm.o -c
$ gcc main.c phy.o frm.o
$ nm phy.o | grep _cb
0000000000000000 W phy_cb
$ nm frm.o | grep _cb
0000000000000010 W frm_cb
0000000000000000 T phy_cb
$ nm a.out | grep _cb
000000000040052d T frm_cb
0000000000400581 T phy_cb
nm
中的“W”表示它是一个弱符号。
关于c - __attribute__((weak)) 不适用于多个目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397850/
我正在阅读为 STM32 定义中断 vector 的代码 here .出于某种原因,同时使用了 __attribute__((weak)) 和 #pragma weak: void __attribu
Vala 中的弱引用和无主引用有什么区别。 根据我从 Vala 教程中学到的知识,弱引用和无主引用都不算在内,当真实实例超出范围时,它们将引用 null(!!)。 为什么出于一个原因应该有两种不同的方
正如我们所知,在 block 中使用 strong self 会导致循环保留和内存泄漏。通常的做法是在 block 中使用弱 self ,还是将弱 self 分配给 block 中的 strong s
所以我正在尝试对我用 swift 编写的代码进行一些润色和分析。我有一堆问题很详细,通过搜索弱引用和强引用等主题很难找到它们。 例如,我没有看到 XCode 提示下面用于 socket 的任何一行。如
为什么weak.lock()返回 nullptr在此代码片段中: std::weak_ptr weakPtr1 = std::make_shared(6); std::cout shar
创建了一个模板函数C++ template void myswap(T&d,T&s) 。Main 将其用于 int、double、complex 类型。使用 g++ 编译源代码。通过 nm 转储符号
什么时候不应该鼓励弱类型?大型项目中不鼓励使用弱类型吗?如果左侧像下面这样强烈键入,那将是该规则的例外吗? int i = 5 string sz = i sz = sz + "1"
在接下来的 0.5 秒延迟期间,tableViewManager 可能会被释放。我想确保在嵌套闭包内与 textView 交互时 textView 是弱的。我该怎么做? tableViewManage
动机 我有 2 个静态库,libStatic1.a 和 libStatic2.a。此外,我还有许多使用 libStatic1.a 编译的 SO(共享对象)。至此,libStatic1.a 和 libS
让我们调用一些函数,它有一个转义闭包作为参数: someFunc(complition: { self.someAnotherFunc() }) 相当于: someFunc(complitio
我想通过使用聚合来构建一个包含多个子对象的类TParent。有些对象是独立的,而有些对象也可能依赖于其他子对象。所有子对象都必须有对父对象的引用。我还想尽可能使用接口(interface)。 为此,我
我正在编写一个需要 SQL Server SMO 库的 .NET 工具。我不在乎它是来自 Server 2005 (9.0)、2008 (10.0) 还是 2008 R2(可能是 10.5,没有检查)
所以我最近一直在考虑一些自动内存管理的想法——特别是,我一直在考虑实现一个基于引用计数的内存管理器。当然,每个人都知道循环引用会扼杀幼稚的引用计数。解决方案:弱引用。就我个人而言,我讨厌以这种方式使用
我知道,在非引用类型数据上使用 weak 时,这会引发错误。但是,我在我自己创建的类上使用它。只是想知道是否有人遇到同样的问题。 internal static func registeruUser(
我有一个名为 Panel 的类,它包含这样一个弱属性: @property (nonatomic, weak) Dialog *container; 在 Instruments 中,我可以看到 set
这个问题与this post非常相似- 但不完全是 我在 .csv 文件中有一些数据。数据精确到第 4 位 (#.####)。 在 Excel 或 SAS 中计算平均值给出的结果精确到第 5 位 (#
我正在编写一个名为“MQTT_interface”的类。我需要在此类的“重新连接”方法中使用“回调”功能。我想开发人员会为自己编写函数“回调”,如果没有,将会有一种同名的弱函数(“回调”),它会向控制
在 Java 中,如果内存不足,弱引用将被垃圾回收。在 Linux 中,malloc() 总是返回一个强引用,即。在调用者调用 free() 函数之前,指针永远不会被释放。 我想分配一个缓冲区用于缓存
我可能对 weak 理解有误: 我的情况: 具有一些弱回调的“物理层” 实现这些回调的“框架层”,并为应用层提供新的 WEAK 回调 主要 - 应用层。 phy.h #pragma once void
我很想知道是否有一种方法可以在 Linux、OS X 或 Windows 等常见操作系统的用户空间中分配“弱”内存(标准接口(interface)显然不可能)。我的意思是那种 mmap(),如果操作系
我是一名优秀的程序员,十分优秀!