如何在多个文件中定义 extern 函数并指定要使用的定义

How to define an extern function in multiple files and specify which definition to use?

本文关键字:定义 函数 extern 文件      更新时间:2023-10-16

不确定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;
}

我可以看到两个选项:

  1. 宏 - 在每个标头(board1.hppboard2.hpp)中定义一个这样的宏

#define Init Init_boardN

其中Init_boardN是你初始化板号N的特定功能。这允许您以旧方式将Init称为Init()

  1. Init函数(建议的枚举)的附加参数,以告诉它要初始化哪个板。您可以根据参数从Init主体调用真正的 init 函数(特定于板)。