如何在多个文件中定义 extern 函数并指定要使用的定义
How to define an extern function in multiple files and specify which definition to use?
不确定extern
是否是处理这种情况的正确方法,但这是我目前尝试的方法。
我有一个在多个项目之间共享通用代码的库,其中一些具有不同的引脚配置,必须在库中的_system_pre_init()
功能期间完成(由于微处理器行为,在main()
之前调用)。
前任:
开机.cpp
extern void Init(void);
// called prior to main() due to microprocessor behavior
extern "C" int _system_pre_init(void)
{
Init();
return 1;
}
板1.马力
void Init(void);
板1.cpp
void Init(void)
{
// init specific to board 1
}
板2.hpp
void Init(void);
板2.cpp
void Init(void)
{
// init specific to board 2
}
计划是让实现库的项目 #include 它需要的任何板头,这反过来又会定义适当的 Init() 函数。
主.cpp
#include "board1.hpp"
int main(int argc, char ** argv)
{
//...
}
但是,看起来我包含的板头对 Init() 的定义没有任何影响。 我该如何管理? 还是有其他更适合这里的范式?
提供板头是试图提供"编译时" 定义",而不是"运行时发现"。我是 希望这在某种程度上是可能的
在我的大多数嵌入式系统工作中,这个想法都是在make文件中实现的。 即你要么构建目标 1,要么构建目标 2。 您正在构建的决定由用户通过选择 make 文件的正确目标来完成。
构建整个系统时,应指定"all"。
确定目标后,make 文件仅生成该目标所需的文件。
未使用条件编译标志。
但是,也许这没有用...如果你不使用制造。
看来您要做的是在编译时决定应用程序将使用哪个板。功能_system_pre_init(void)
需要知道哪个板。
我会考虑的方法是将编译器命令行定义为构建环境的一部分,该命令行将选择目标板类型。然后,此编译器命令行定义将在文件启动中使用.cpp以包含 board1.cpp 或 board2.cpp 或其他任何内容。 请注意,我说的是电路板定义C++源文件,而不是头文件。
不同版本的板将具有相同的函数名称、类等,尽管实现将是特定于板的。
由于板实现文件将包含在引导.cpp文件中,这意味着所包含的任何板文件(由编译器命令行选项确定)都可用于函数_system_pre_init(void)
以及其余代码。
因此,例如,您可能有一个编译器命令行选项-DBOARDTYPE=1
或-DBOARDTYPE=2
,然后在引导.cpp文件中,您将具有预处理器宏,例如:
#if BOARDTYPE == 1
#include "board1.cpp"
#elif BOARDTYPE == 2
#include "board2.cpp"
#endif
// called prior to main() due to microprocessor behavior
extern "C" int _system_pre_init(void)
{
Init();
return 1;
}
我可以看到两个选项:
- 宏 - 在每个标头(
board1.hpp
,board2.hpp
)中定义一个这样的宏
#define Init Init_boardN
其中Init_boardN
是你初始化板号N
的特定功能。这允许您以旧方式将Init
称为Init()
。
Init
函数(建议的枚举)的附加参数,以告诉它要初始化哪个板。您可以根据参数从Init
主体调用真正的 init 函数(特定于板)。
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数