1

我最近开始为 STM32F103 微控制器学习 C++,我正在使用一个名为 STM32plus 的库。问题是,我根本不习惯 C++ 和指针,而这个库实际上依赖于它们。

所以目前,我有 1 个源文件,我的所有代码都位于其中,我想开始将其拆分为多个部分。在我的主源文件的顶部,我有这样的声明:

#include "config/stm32plus.h"
#include "config/display/tft.h"

using namespace stm32plus;
using namespace stm32plus::display;

typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode;
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel;

LcdAccessMode *_accessMode;
LcdPanel *dsp;
Font *font;

还有更多,但看起来像这样(本节用于显示,还有更多用于 SD 卡和其他组件)。我基本上明白这里发生了什么。我在这个文件中的一个函数如下所示:

template <class T>
void print(T text)
{
    textx+=dsp->measureString(text);
    *dsp<<Point(textx,texty)<<text;
}
void println()
{
    textx=0;
    texty+=font->getHeight()+1;
}
template <class T>
void println(T text)
{
    print(text);
    println();
}

现在,我想尝试将它移动到一个单独的文件或类(Print.cpp 和 Print.h)中,但是在尝试了各种不同的东西之后,比如外部类,包括整个库、前向声明,以及在谷歌上搜索了 10 多个我尝试编译该代码时遇到不同的错误,并在谷歌上搜索我正在尝试做的事情,我根本找不到任何解决方案。我会发布我尝试过的示例,但我删除了我之前的所有尝试,但它们根本不起作用。

那么,谁能给我一个将这些函数放在单独的文件/类中的类或方法的示例,以便我可以在主程序中使用它,同时仍然允许主程序使用显示功能?

任何帮助/建议表示赞赏。请注意,我还是 C++ 的新手,而且这是一个嵌入式系统,因此 RAM 是有限的(我无法创建显示对象/类的另一个实例)

4

1 回答 1

1

关于模板函数:
当您在文件中使用模板特化时,模板函数的定义需要是可见的。要实现这一点,您有两种可能性:

  1. 您在头文件中编写模板函数的定义,并将此头文件包含在将使用这些函数的所有 .cpp 文件中。

  2. 您为将使用的每种类型编写模板函数的前向声明,这称为模板函数专业化前向声明(有关确切语法,请参见此线程)。

关于文件范围指针:
如果您希望打印功能在print.cpp其中并使用dsp指针,则需要使该指针可见。你可以:

1)添加第二个参数print()类型LCDPanel *(好的解决方案)。这样每个阅读函数声明的人都知道函数print()使用了 aLCDPanel而不必阅读函数定义来查找使用了哪些全局变量。

2)使LCDPanel指针全局,因此在print.cpp(坏的解决方案)中可见:

/* main.cpp */
LcdPanel *dsp; 

/* main.h */
#include "config/stm32plus.h"
#include "config/display/tft.h"

using namespace stm32plus;
using namespace stm32plus::display;

typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode;
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel;
extern LCDPanel *dsp;

/* print.cpp */
#include "main.h"

(顺便说一句,dsp显示器不是一个好名字,因为dsp在嵌入式世界中用于数字信号处理)

于 2013-09-25T10:46:09.200 回答