如何在多个文件中定义一个外部函数并指定使用哪个定义?

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

不确定 extern 是否是处理这种情况的正确方法,但这是我目前尝试的方法。

我有一个跨多个项目共享通用代码的库,其中一些具有不同的引脚配置,必须在库中的 _system_pre_init() 函数期间完成(在 main() 之前调用,由于微处理器行为)。

例如:

boot.cpp

extern void Init(void);

// called prior to main() due to microprocessor behavior
extern "C" int _system_pre_init(void)
{
    Init();

    return 1;
}

board1.hpp

void Init(void);

board1.cpp

void Init(void)
{
    // init specific to board 1
}

board2.hpp

void Init(void);

board2.cpp

void Init(void)
{
    // init specific to board 2
}

该计划是为实施库的项目#include 它需要的任何板 header,这将反过来定义适当的 Init() 函数。

main.cpp

#include "board1.hpp"

int main(int argc, char ** argv)
{
    //...
}

但是,看起来我包含的板 header 对 Init() 的定义没有任何影响。我该如何管理?还是有其他更适合这里的范例?

我可以看到两个选项:

  1. 宏 - 在每个 header (board1.hpp, board2.hpp) 中定义一个像这样的宏

#define Init Init_boardN

其中 Init_boardN 是您初始化板号 N 的特定函数。 这允许您以旧方式调用 Init 作为 Init()

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

看来您想要做的是在编译时决定应用程序将使用哪个板。函数 _system_pre_init(void) 需要知道哪个板。

我考虑的方法是将编译器命令行定义为构建环境的一部分,这将 select 目标板类型。然后,此编译器命令行定义将在文件 boot.cpp 中使用,以包含 board1.cpp 或 board2.cpp 或其他任何内容。请注意,我说的是电路板定义 C++ 源文件而不是头文件。

不同版本的开发板都将具有相同的函数名称,类,等等,尽管实现将是特定于开发板的。

由于板实现文件将包含在 boot.cpp 文件中,这意味着包含的任何板文件(由编译器命令行选项确定)都可用于函数 _system_pre_init(void) 以及您的其余代码。

例如,您可能有一个编译器命令行选项 -DBOARDTYPE=1-DBOARDTYPE=2,然后在您的 boot.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;
}

Providing the board headers is an attempt to provide a "compile-time definition" of board hardware instead of a "runtime discovery". I'm hoping this is in someway possible

在我的大部分嵌入式系统工作中,这个想法都是在 make 文件中实现的。也就是说,您要么构建 target1,要么构建 target2。您正在构建的决定由用户通过选择生成文件的正确目标来完成。

构建整个系统时,您将指定'all'。

确定目标后,make 文件仅构建该目标所需的文件。

未使用条件编译标志。

但是,如果您不使用 make,这可能没有用。