__WEAK_FUNC
时间: 2023-12-01 10:04:01 浏览: 72
__WEAK_FUNC是一个函数修饰符,它允许用户在另一个文件中定义一个与修饰过的函数完全相同的函数。如果用户没有重新实现这个函数,则编译器将执行带有__WEAK_FUNC修饰符的函数。下面是一个例子:
假设我们有两个文件A.cpp和B.cpp,其中A.cpp包含以下内容:
```c++
#include <stdio.h>
extern void func();
void __attribute__((weak)) func() {
printf("int fake func\n");
}
void main() {
func();
}
```
B.cpp包含以下内容:
```c++
#include <stdio.h>
void func() {
printf("int real func\n");
}
```
当编译器编译这两个文件时,它将选择B.cpp中定义的func()函数,因为它与A.cpp中的带有__WEAK_FUNC修饰符的函数完全相同。因此,当我们运行A.cpp时,它将输出“int real func”。
相关问题
SYM_FUNC_START_ALIAS和SYM_FUNC_START_WEAK_PI区别
SYM_FUNC_START_ALIAS和SYM_FUNC_START_WEAK_PI都是符号定义宏,主要用于定义函数符号。它们的区别在于:
1. SYM_FUNC_START_ALIAS宏定义的符号是强符号,即在链接过程中如果出现相同名称的符号,则会出现链接错误。这种符号通常用于定义全局函数或变量。
2. SYM_FUNC_START_WEAK_PI宏定义的符号是弱符号,即在链接过程中如果出现相同名称的符号,则会忽略掉该符号,而使用其他同名符号。这种符号通常用于定义可选的函数或变量,如果已经有同名符号,则使用已有符号,否则使用该符号。
因此,如果您需要定义一个必须存在且不能重复定义的符号,可以使用SYM_FUNC_START_ALIAS宏。如果您需要定义一个可选的符号,如果已经存在同名符号则使用已有符号,否则使用该符号,则可以使用SYM_FUNC_START_WEAK_PI宏。
void Enable(uint8_t inst_id, bool enable, MultiAdvCb cb, uint16_t duration, uint8_t maxExtAdvEvents, MultiAdvCb timeout_cb) override { VLOG(1) << __func__ << " inst_id: " << +inst_id; if (inst_id >= inst_count) { LOG(ERROR) << "bad instance id " << +inst_id; return; } AdvertisingInstance* p_inst = &adv_inst[inst_id]; VLOG(1) << __func__ << " enable: " << enable << ", duration: " << +duration; if (!p_inst->in_use) { LOG(ERROR) << "Invalid or no active instance"; cb.Run(BTM_BLE_MULTI_ADV_FAILURE); return; } if (enable && (duration || maxExtAdvEvents)) { p_inst->timeout_cb = std::move(timeout_cb); } p_inst->duration = duration; p_inst->maxExtAdvEvents = maxExtAdvEvents; if (enable && p_inst->address_update_required) { p_inst->address_update_required = false; ConfigureRpa(p_inst, base::Bind(&BleAdvertisingManagerImpl::EnableFinish, weak_factory_.GetWeakPtr(), p_inst, enable, std::move(cb))); return; } EnableFinish(p_inst, enable, std::move(cb), 0); }
这段代码是一个 BLE 广播管理器的 Enable 函数。该函数用于启用或禁用指定实例的广播,并支持设置广播的持续时间、最大事件数和超时回调函数。
具体解释如下:
- 首先,函数接受四个参数:实例 ID、启用/禁用标志、广播持续时间、最大事件数和超时回调函数。
- 接下来,通过 inst_id 获取 AdvertisingInstance 对象指针 p_inst,用于存储广播实例的相关信息。
- 然后,检查 p_inst 是否已经被使用。如果没有被使用,直接返回错误信息,并调用回调函数 cb。
- 如果启用广播并且设置了持续时间或最大事件数,则将超时回调函数 timeout_cb 移动到 p_inst->timeout_cb 中。
- 接着,设置广播持续时间和最大事件数,并检查是否需要更新随机地址。如果需要,则调用 ConfigureRpa 函数更新随机地址,并在更新完成后调用 EnableFinish 函数完成启用广播的操作。
- 如果不需要更新随机地址,则直接调用 EnableFinish 函数完成启用广播的操作。其中,该函数将根据 enable 参数决定是启用广播还是停止广播,并调用回调函数 cb 通知结果。如果启用广播时设置了持续时间或最大事件数,则在广播结束后调用超时回调函数。
阅读全文