我正在处理的这个固件有两个不同的makefile.

为了区分这两个版本,我们在ble_通信中声明了两个变量.C

static uint8_t data_version1[] = {0x00, 0x00, 0x00, 0x00, 0x00};
static uint8_t data_version2[] = {0x01, 0x00, 0x00, 0x00, 0x00};

在ble_通信内部.我们有一个函数叫做

uint32_t start_broadcasting(void)
{
send_beacon(OPCODE, 0, /* determine data version here to send at runtime */, key);
}

我的问题是,因为我们使用的是同一个文件ble_通信.c对于这两个版本的构建,代码如何在运行时 Select 用于构建的变量?如果是数据版本1,我希望它使用数据版本1[],如果是数据版本2,它使用数据版本2[].

我不能使用#ifndef switch语句,因为新的设计准则不允许我使用它们

推荐答案

老实说,我更愿意使用#ifdef,但这里有一个解决办法.

使用所需的数据创建两个文件,并在构建时使用makefile Select 所需的文件.

首先,准备两个C文件,ble_communication_data1.cble_communication_data2.c.请随意 Select 一个更清晰的名字.

在每个C文件中放置所需的数据,但名称保持不变.

ble_communication_data1.c

uint8_t ble_communication_data[5] = {0x00, 0x00, 0x00, 0x00, 0x00};

ble_communication_data2.c

uint8_t ble_communication_data[5] = {0x01, 0x00, 0x00, 0x00, 0x00};

创建头文件以访问数据:

ble_communication_data.h

extern uint8_t ble_communication_data[5];

修改ble_communication.c,使其使用通用变量名:

#include "ble_communication_data.h"

uint32_t start_broadcasting(void)
{
    send_beacon(OPCODE, 0, ble_communication_data, key);
}

最后,在每个makefile中,将正确的ble_communication_datac文件添加到要编译的文件列表中.

C相关问答推荐

为什么 memcpy() 随机不复制正确的值?

为什么启用优化时 GCC 11 编译器会产生奇怪的输出?

Gnuplot 和 C - 绘制不同的符号/ colored颜色

在 C 中使用数组而不是向量

幂函数给出的答案与 C 中的 math.pow 函数不同

确定在嵌入式 C 中运行时使用哪个变量

在编译时构建静态数组

判断由大括号组成的输入字符串是否格式正确

通过默认网关地址的硬件地址而不是以太网多播地址发送多播

为什么 malloc() 被认为是库调用而不是系统调用?

为什么使用 MOV 指令将 XOR 交换优化为普通交换?