如何在多个文件中定义一个外部函数并指定使用哪个定义?
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() 的定义没有任何影响。我该如何管理?还是有其他更适合这里的范例?
我可以看到两个选项:
- 宏 - 在每个 header (
board1.hpp
, board2.hpp
) 中定义一个像这样的宏
#define Init Init_boardN
其中 Init_boardN
是您初始化板号 N
的特定函数。
这允许您以旧方式调用 Init
作为 Init()
。
-
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,这可能没有用。
不确定 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() 的定义没有任何影响。我该如何管理?还是有其他更适合这里的范例?
我可以看到两个选项:
- 宏 - 在每个 header (
board1.hpp
,board2.hpp
) 中定义一个像这样的宏
#define Init Init_boardN
其中 Init_boardN
是您初始化板号 N
的特定函数。
这允许您以旧方式调用 Init
作为 Init()
。
-
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,这可能没有用。