- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想正确使用 __attribute__((weak))
来实现函数覆盖。
我的代码没有按预期工作。有什么问题吗?
common.h
#include <stdio.h>
int __attribute__((weak)) doJob1(void);
int __attribute__((weak)) doJob2(int, int);
typedef int (*Job1)(void);
typedef int (*Job2)(int, int);
common.c
#include <stdio.h>
#include "common.h"
__attribute__((weak)) int doJob1(void)
{
printf("doJob1 common WEAK\n");
return 0;
}
__attribute__((weak)) int doJob2(int a, int b)
{
printf("doJob2 common WEAK\n");
return 0;
}
driverA.c
#include <stdio.h>
#include "common.h"
int doJob1(void)
{
printf("doJob1 driverA Strong\n");
}
void main()
{
Job1 j1 = doJob1;
Job2 j2 = doJob2;
j1();
j2(0, 0);
}
当我运行程序时,我看到:
sh> ./a.out
doJob1 common WEAK
doJob2 common WEAK
我期望的是这个结果,而不是:
sh> ./a.out
doJob1 driverA Strong
doJob2 common WEAK
如何获得预期的结果?
总的来说,有很多形式为“Job1”、“Job2”...“JobXX”的函数。driverA 想对少数工作使用自己的函数,对某些工作使用公共(public)函数,并且某些函数将为 NULL:
ex>
Job1 - driverA_Job1
Job2 - common Job2
Job3 - NULL
..
不同的驱动程序,比如驱动程序 B,可能会做出不同的选择:
Job1 - common job1
job2 - B's own job2
job5 - NULL
如何正确覆盖函数?
最佳答案
这是因为 common.h
头文件中的 __attribute__((weak))
声明适用于这两个定义; common.c
中的那个(你打算变弱)以及 driverA.c
中的定义(你打算变强)。
要获得您想要的行为,请在 common.c
中应用 __attribute__((weak))
>,而不是在头文件中。
关于c - 如何正确使用 "weak"?或 C 函数覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341717/
我正在阅读为 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(),如果操作系
我是一名优秀的程序员,十分优秀!