我最近开始学习STM32F103微控制器的C ++,我正在使用一个名为STM32plus的库。问题是,我根本不习惯C ++和指针,而且这个库实际上依赖于它们。
目前,我有一个源文件,其中包含我的所有代码,我想开始将其拆分为多个部分。在我的主要源文件的顶部,我有这样的声明:
#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)中,但是在尝试了各种不同的东西之后,比如extern类,包括整个库,前向声明和之后谷歌搜索超过10个不同的错误我试图编译该代码,并搜索我正在尝试做什么,我根本找不到任何解决方案。我会发布我尝试过的例子,但是我删除了以前的所有尝试,但它们根本不起作用。
那么,任何人都可以给我一个类或方法的例子将这些函数放在一个单独的文件/类中,这样我就可以在主程序中使用它,同时仍允许主程序使用显示函数吗?
感谢任何帮助/建议。请注意,我还是C ++的新手,这是一个嵌入式系统,所以RAM是有限的(我不能创建显示对象/类的另一个实例)
答案 0 :(得分:1)
关于模板功能:
当您在文件中使用模板特化时,需要显示模板函数的定义。为实现这一目标,您有两种可能性:
您可以在头文件中编写模板函数的定义,并将此头文件包含在将使用这些函数的所有.cpp文件中。
您为每个将要使用的类型编写模板函数的前向声明,称为模板函数特化前向声明(有关确切语法,请参阅此thread)。
< / LI> 醇>关于文件范围指针:
如果您希望打印功能位于print.cpp
并使用dsp
指针,则需要使该指针可见。你可以:
1)向print()
类型的LCDPanel *
添加第二个参数(好的解决方案)。这样,每个读取函数声明的人都知道函数print()
使用LCDPanel
并且不必读取函数定义来查找使用的全局变量。
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
用于嵌入式世界中的数字信号处理)