c++ - 在静态库(C++、Eclipse CDT)中使用#ifdef
问题描述
我有一个关于我在 Eclipse CDT 中的项目管理、在 C++ 中编程和使用 GCC 编译的问题。假设我有一个适用于 A 型微控制器 (driverA.hpp) 的驱动程序库和一个适用于 B 型微控制器 (driverB.hpp) 的驱动程序库(外围设备等)。在这两个库中,函数接口是相同的。此外,我有某些设备的库,例如设备 X,它们应该可用于两种控制器类型(例如:deviceX.hpp)。在使用这些东西的项目(projectY)中,我将添加相应的驱动程序库(driverA.hpp 或 driverB.hpp),并且我想添加一个编译器标志以命名我想要使用的控制器类型。
在 deviceX.hpp 中,我想区分这两种类型,所以我想添加如下内容:
#ifdef CONTROLLER_A
#include driverA.hpp
#elseif CONTROLLER_B
#include driverB.hpp
#endif
这个库也将链接到 projectY,我想在其中添加一个编译器标志,如 CONTROLLER_A,并且将链接具有正确控制器类型的库 deviceX。
但是,我知道,那是行不通的。这就是为什么我要问你:做这种库依赖的最好(或:常见)方法是什么?将 deviceX 库添加为源位置?还是有其他方法?
此致
解决方案
有很多方法可以实现您想要的,但需要注意的一点是,如果两个 MCU 的驱动程序具有相同的接口(根据您的问题),那么基于不同的 MCU #defines 包含不同的标头绝对没有意义。如果您希望解决方案基于#define,您可以例如执行以下操作:
头文件(some_driver.h):
// init.
void some_driver_init(struct init_params ip);
// start driver
void some_driver_start();
“假”实施(some_driver.c):
#if defined(ARM_CORTEX_M3)
#include "some_driver_arm_m3.c"
#elif defined(TI_MSP430)
#include "some_driver_msp430.c"
#elif defined(...)
//... and so on...
#else
#pragma warning "MCU NOT SUPPORTED!"
#endif
然后是每个 MCU 的“真正”实现:
some_driver_arm_m3.c
// init. M3 Cortex driver
void some_driver_init(struct init_params ip)
{
// actual M3 implementation goes here
}
// start M3 Cortex driver
void some_driver_start()
{
// actual M3 implementation goes here
}
some_driver_msp430.c
// init. MSP430 driver
void some_driver_init(struct init_params ip)
{
// actual MSP430 implementation goes here
}
// start MSP430 driver
void some_driver_start()
{
// actual MSP430 implementation goes here
}
... 等等。
推荐阅读
- regex - 如何递归提取url路径
- php - 如何遍历这个困难的多维数组并仅添加某些字段以分隔 mysql 数据库的行
- amazon-web-services - AWS角色和用户没有任何策略,为什么我仍然可以访问K8s集群?
- c - 调试C程序时VS Code不显示输出
- ios - 为什么在 SwiftUI 的 TabView 中切换选项卡时 onDisappear 之后再次调用 onAppear?
- python - 将给定时间从给定时区转换为 UTC
- kubernetes - 将时间戳附加到 kubernetes --watch-only 命令
- javascript - 使用多个参数进行排序
- lua - Lua Roblox API:我怎样才能让跑进盒子的玩家/角色去抖动
- javascript - 在 React 中调用 Firebase HTTPS 可调用云函数