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

时间:2015-06-10 21:56:35

标签: c++ c-preprocessor

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

计划是实现libary的项目#include它需要的任何板头,这将反过来定义适当的Init()函数。

的main.cpp

#include "board1.hpp"

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

但是,它看起来不像我包含的板头对Init()的定义有任何影响。我该怎么办呢?或者还有其他一些适合这种情况的范例吗?

3 个答案:

答案 0 :(得分:2)

  

提供板头是尝试提供编译时间   定义"板硬件而不是运行时发现"。我'米   希望这是可能的

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

在构建整个系统时,您需要指定所有'。

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

未使用条件编译标志。

但是,如果你不使用make,也许这没用。

答案 1 :(得分:1)

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

我会考虑的方法是将编译器命令行定义为构建环境的一部分,以选择目标板类型。然后,此编译器命令行定义将在文件boot.cpp中使用,以包括board1.cpp或board2.cpp,或者什么。请注意,我说的是板定义C ++源文件而不是头文件。

不同版本的电路板都具有相同的功能名称,类等,但实现方式可能是特定于电路板的。

由于电路板实现文件将包含在boot.cpp文件中,因此将意味着由编译器命令行选项确定的所包含的电路板文件可用于函数_system_pre_init(void) as以及你的其余代码。

因此,例如,您可能有-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;
}

答案 2 :(得分:0)

我可以看到两个选项:

  1. 宏 - 在每个标题(board1.hppboard2.hpp)中定义一个这样的宏
  2. #define Init Init_boardN

    其中Init_boardN是您对电路板编号N的特定功能。 这样您就可以使用Init以旧方式呼叫Init()

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