求教.h头文件和.cpp文件的问题。

brucewoo 2018-04-27 10:00:59
大家好。、
在下问个小白问题,希望大家不要见笑。
最近在写一个Arduino的步进电机驱动库,其中一个类的头文件和cpp文件如下:
(Arduino 官方IDE和VS2015 Visual Micro插件环境下都一样)

bwStepBlock.h

#define MAX_B_IDX stpBlock::maxBlockIdx
#define CUR_B_IDX stpBlock::curBlockIdx
#define CUR_BLOCK pBlocks[CUR_B_IDX]
#define CUR_B_LaIdx CUR_BLOCK.LaIdx
#define CUR_B_LaPhs CUR_BLOCK.LaCurPhase

class stpBlock
{
public:
static byte Prescaler; //定时器分频值
static byte maxBlockIdx; //最大block索引值,0开始
static byte curBlockIdx; //当前执行的block索引值

stpBlock() {} ; //有重载一定要定义一次
//axises=轴数量,1开始计数; LaPhases=阶段数,1开始计数
stpBlock(byte axises, byte LaPhases)
{
LaMaxPhaseIdx = LaPhases - 1;
pLaTickCs = new unsigned int[LaPhases];
pLaTickTG = new unsigned int[LaPhases];
pLaDeltaTick = new int[LaPhases];
pLaGroupCycle = new byte[LaPhases];
pLaPcd = new unsigned long[LaPhases];

pAllDir = new bool[axises];
pAllLev = new bool[axises];
pAllPcd = new unsigned long[axises];
counter = new unsigned long[axises];
}

byte status = 1; //0=已完成 ;1=已计算,未完成或未执行
unsigned long maxPf = 0; //最大步数
//byte maxAxisIdx = 0; //轴索引数,0开始 (轴数量) //考虑到此对象与电机数对应,所以不动作的电机都要存在,不动作的电机*pAllPcd=0

byte LaIdx = 0; //长轴索引号
byte LaMaxPhaseIdx = 0; //长轴phase数量,0开始 (阶段数量)
byte LaCurPhase = 0; //当前阶段标记
unsigned int* pLaTickCs = NULL; //长轴各阶段Tick的数组指针
unsigned int* pLaTickTG = NULL; //长轴各阶段Tick目标值的数组指针
int* pLaDeltaTick = NULL; //长轴各阶段DeltaTick的数组指针 加速,delta<0 匀速,delta=0 减速,delta>0
byte* pLaGroupCycle = NULL; //长轴各阶段GC的数组指针
byte GC_count = 1; //长轴当前阶段的GC count,1开始
unsigned long* pLaPcd = NULL; //长轴各阶段步数的数组指针,执行时count down

bool* pAllDir = NULL; //各轴方向电平,建立Block时赋值
bool* pAllLev = NULL; //各轴驱动电平标记
unsigned long* pAllPf = NULL; //所有轴每个的总部数,不倒数
unsigned long* pAllPcd = NULL; //各轴步数的数组指针,执行时count down
unsigned long* counter = NULL; //各轴插补counter

//完成后释放里面的指针
void clear();

~stpBlock()
{
status = 1;
delete pLaTickCs;
pLaTickCs = NULL;
delete pLaTickTG;
pLaTickTG = NULL;
delete pLaDeltaTick;
pLaDeltaTick = NULL;
delete pLaGroupCycle;
pLaGroupCycle = NULL;
delete pLaPcd;
pLaPcd = NULL;
delete pAllDir;
pAllDir = NULL;
delete pAllLev;
pAllLev = NULL;
delete pAllPcd;
pAllPcd = NULL;
delete counter;
counter = NULL;
}


}; //stpBlock类定义结束

//------------------------------------------------------------------------
stpBlock* pBlocks = NULL; //block数组指针全局变量




bwStepBlock.cpp

#include "bwStepBlock.h"

byte stpBlock::maxBlockIdx = 0;
byte stpBlock::curBlockIdx = 0;
byte stpBlock::Prescaler = 64;

void stpBlock::clear()
{
status = 1;
delete pLaTickCs;
pLaTickCs = NULL;
delete pLaTickTG;
pLaTickTG = NULL;
delete pLaDeltaTick;
pLaDeltaTick = NULL;
delete pLaGroupCycle;
pLaGroupCycle = NULL;
delete pLaPcd;
pLaPcd = NULL;
delete pAllDir;
pAllDir = NULL;
delete pAllLev;
pAllLev = NULL;
delete pAllPcd;
pAllPcd = NULL;
delete counter;
counter = NULL;
}


编译的时候,一堆错误,显示很多数据类型以及变量都未定义。(Arduino 官方IDE和VS2015 Visual Micro插件环境下都一样)
而且在vs2015 环境下编辑是没有问题,编辑的时候没有显示错误,并且可以正确提示类的成员对象。
但如果把.cpp文件里的内容粘贴进.h 文件的末尾,并删除.cpp后,就可以正常编译。

百思不得其解,请大家帮忙看一下,是什么地方出了问题,谢谢。
...全文
1080 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
brucewoo 2018-04-28
  • 打赏
  • 举报
回复
引用 13 楼 qq_31930499 的回复:
1.应该你没有包含定义byte和NULL的头文件 2.解释“如果把.cpp文件里的内容粘贴进.h 文件的末尾,并删除.cpp后,就可以正常编译。” --》 那是因为这个头文件没有被包含在.cpp源文件中,所以根本没有编译这个头文件,所以你会看到编译“正常”,你试试把这个头文件包含在别的源文件中试试,编译肯定不会正常了。 3.综上得出,就是没有定义byte和NULL
您好,谢谢回复。 我可能没有搞清楚.h 和.cpp文件的机理。 例如,这样说吧,例如,byte 和 NULL 的typedef 和#define 存在于arduino.h这个文件 那么,我编写bwStepBlock.h的时候,里面用到了byte和NULL,那么是不是一定要先在bwStepBlock.h 里面 include<arduino.h>? 如果没有,我在主程序文件中,先include<arduino.h> 再include<bwStepBlock.h>是否可以?但我试过这样是报错的。 是不是我对他们的机制的理解有误? 谢谢指导!
Tw!light 2018-04-28
  • 打赏
  • 举报
回复
1.应该你没有包含定义byte和NULL的头文件 2.解释“如果把.cpp文件里的内容粘贴进.h 文件的末尾,并删除.cpp后,就可以正常编译。” --》 那是因为这个头文件没有被包含在.cpp源文件中,所以根本没有编译这个头文件,所以你会看到编译“正常”,你试试把这个头文件包含在别的源文件中试试,编译肯定不会正常了。 3.综上得出,就是没有定义byte和NULL
Isnis-fallen 2018-04-28
  • 打赏
  • 举报
回复
加上头文件#include<stdio.h>
donjin9 2018-04-28
  • 打赏
  • 举报
回复
把include<arduino.h>从bwStepBlock.cpp移到bwStepBlock.h文件中。
Tw!light 2018-04-28
  • 打赏
  • 举报
回复
引用 17 楼 brucewoo 的回复:
[quote=引用 16 楼 qq_31930499 的回复:] 刚才我试了一下,就你提供的程序,我按照上面的方法修改后是没有问题的。若你原工程中若用上面的方法还有问题,那应该不是头文件的问题了,或者没有定义,或者是别的问题了。
你好,你说的“上面的方法”是指把cpp的内容放到.h文件里吗?[/quote] 就是在cpp源码中,先include<arduino.h> 再include<bwStepBlock.h>
brucewoo 2018-04-28
  • 打赏
  • 举报
回复
引用 16 楼 qq_31930499 的回复:
刚才我试了一下,就你提供的程序,我按照上面的方法修改后是没有问题的。若你原工程中若用上面的方法还有问题,那应该不是头文件的问题了,或者没有定义,或者是别的问题了。
你好,你说的“上面的方法”是指把cpp的内容放到.h文件里吗?
Tw!light 2018-04-28
  • 打赏
  • 举报
回复
刚才我试了一下,就你提供的程序,我按照上面的方法修改后是没有问题的。若你原工程中若用上面的方法还有问题,那应该不是头文件的问题了,或者没有定义,或者是别的问题了。
Tw!light 2018-04-28
  • 打赏
  • 举报
回复
引用 14 楼 brucewoo 的回复:
[quote=引用 13 楼 qq_31930499 的回复:] 1.应该你没有包含定义byte和NULL的头文件 2.解释“如果把.cpp文件里的内容粘贴进.h 文件的末尾,并删除.cpp后,就可以正常编译。” --》 那是因为这个头文件没有被包含在.cpp源文件中,所以根本没有编译这个头文件,所以你会看到编译“正常”,你试试把这个头文件包含在别的源文件中试试,编译肯定不会正常了。 3.综上得出,就是没有定义byte和NULL
您好,谢谢回复。 我可能没有搞清楚.h 和.cpp文件的机理。 例如,这样说吧,例如,byte 和 NULL 的typedef 和#define 存在于arduino.h这个文件 那么,我编写bwStepBlock.h的时候,里面用到了byte和NULL,那么是不是一定要先在bwStepBlock.h 里面 include<arduino.h>? 如果没有,我在主程序文件中,先include<arduino.h> 再include<bwStepBlock.h>是否可以?但我试过这样是报错的。 是不是我对他们的机制的理解有误? 谢谢指导![/quote] 针对“我在主程序文件中,先include<arduino.h> 再include<bwStepBlock.h>是否可以?但我试过这样是报错的。是不是我对他们的机制的理解有误?” 我认为是你的理解是正确的,因为头文件在预处理的时候,编译器就把头文件的内容加载到源文件,再编译。至于你说的报错,可能是别的问题导致的,我没有你源码和环境,我也不好判断。
brucewoo 2018-04-27
  • 打赏
  • 举报
回复
引用 8 楼 zouxiz 的回复:
错误应该是:byte(还有NULL等)没被typedef过。分析: 1、请问将.cpp文件中的内容剪切至.h并删除.cpp就没有编译错误了,真实情况.h真的被包含了吗? 2、如果.h被包含,在.h前还有哪些其它.h被包含了,byte的定义应该在那些.h里。 或者: 3、如果.h未被包含,根本不参与编译,不报错那是自然了。
打错,是byte这个类型,系统头文件里是typedef uint_8来的,而uint_8是typedef unsigned char这样来的。 VS2015的IDE都能正确追溯到。
走西子 2018-04-27
  • 打赏
  • 举报
回复
错误应该是:byte(还有NULL等)没被typedef过。分析: 1、请问将.cpp文件中的内容剪切至.h并删除.cpp就没有编译错误了,真实情况.h真的被包含了吗? 2、如果.h被包含,在.h前还有哪些其它.h被包含了,byte的定义应该在那些.h里。 或者: 3、如果.h未被包含,根本不参与编译,不报错那是自然了。
brucewoo 2018-04-27
  • 打赏
  • 举报
回复
引用 8 楼 zouxiz 的回复:
错误应该是:byte(还有NULL等)没被typedef过。分析: 1、请问将.cpp文件中的内容剪切至.h并删除.cpp就没有编译错误了,真实情况.h真的被包含了吗? 2、如果.h被包含,在.h前还有哪些其它.h被包含了,byte的定义应该在那些.h里。 或者: 3、如果.h未被包含,根本不参与编译,不报错那是自然了。
应该不是 typedef的问题。 byte 这个变量是arduino系统自动包含的arduino.h里面定义的,在vs2015 IDE里编辑的时候能正确的识别,鼠标放上去可以正确地显示定义情况,一到编译就不行了。 最神奇的是.cpp文件中的内容剪切至.h就可以编译了。 #include这个头文件,<>和""试过都一样。
brucewoo 2018-04-27
  • 打赏
  • 举报
回复
引用 6 楼 qq_36260408 的回复:
没有包含什么头文件吧
不存在头文件交叉引用的问题,我专门开个新项目,只包含了上面哪一个头文件来测试。 最奇怪的是,如果把.cpp文件里的内容粘贴进.h 文件的末尾,并删除.cpp后,就可以正常编译。
qq_36260408 2018-04-27
  • 打赏
  • 举报
回复
没有包含什么头文件吧
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
zhouqunhai 2018-04-27
  • 打赏
  • 举报
回复
去嵌入式问问
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
百度搜相关关键字。
brucewoo 2018-04-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
百度搜相关关键字。
错误信息都是 XXX does not name a type 但觉得不合理啊,像byte之类的,在其他头文件里是有typedef的,而且在VS2015环境下编辑时没有报错。 而且,把cpp文件的内容粘贴到.h文件里又不报错了,这是什么现象?
brucewoo 2018-04-27
  • 打赏
  • 举报
回复
错误信息,一大堆:



In file included from C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:1:0:

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:10:9: error: 'byte' does not name a type

  static byte Prescaler;    //瀹氭椂鍣ㄥ垎棰戝??

         ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:11:9: error: 'byte' does not name a type

  static byte maxBlockIdx;  //鏈?澶lock绱㈠紩鍊硷紝0寮?濮?

         ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:12:9: error: 'byte' does not name a type

  static byte curBlockIdx;   //褰撳墠鎵ц鐨刡lock绱㈠紩鍊?

         ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:16:16: error: expected ')' before 'axises'

  stpBlock(byte axises, byte LaPhases)

                ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:31:2: error: 'byte' does not name a type

  byte status = 1;      //0=宸插畬鎴? 锛?1=宸茶绠楋紝鏈畬鎴愭垨鏈墽琛?

  ^

In file included from C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:1:0:

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:35:2: error: 'byte' does not name a type

  byte     LaIdx = 0;     //闀胯酱绱㈠紩鍙?

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:36:2: error: 'byte' does not name a type

  byte     LaMaxPhaseIdx = 0; //闀胯酱phase鏁伴噺锛?0寮?濮? (闃舵鏁伴噺)

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:37:2: error: 'byte' does not name a type

  byte     LaCurPhase = 0;  //褰撳墠闃舵鏍囪

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:41:2: error: 'byte' does not name a type

  byte*    pLaGroupCycle = NULL; //闀胯酱鍚勯樁娈礕C鐨勬暟缁勬寚閽?

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:42:2: error: 'byte' does not name a type

  byte     GC_count = 1;    //闀胯酱褰撳墠闃舵鐨凣C count锛?1寮?濮?

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:38:28: error: 'NULL' was not declared in this scope

  unsigned int* pLaTickCs = NULL;  //闀胯酱鍚勯樁娈礣ick鐨勬暟缁勬寚閽?

                            ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:39:28: error: 'NULL' was not declared in this scope

  unsigned int* pLaTickTG = NULL;  //闀胯酱鍚勯樁娈礣ick鐩爣鍊肩殑鏁扮粍鎸囬拡

                            ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:40:26: error: 'NULL' was not declared in this scope

  int*     pLaDeltaTick = NULL; //闀胯酱鍚勯樁娈礑eltaTick鐨勬暟缁勬寚閽? 鍔犻?燂紝delta<0 鍖?閫燂紝delta=0 鍑忛?燂紝delta>0

                          ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:43:26: error: 'NULL' was not declared in this scope

  unsigned long* pLaPcd = NULL;   //闀胯酱鍚勯樁娈垫鏁扮殑鏁扮粍鎸囬拡锛屾墽琛屾椂count down

                          ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:45:21: error: 'NULL' was not declared in this scope

  bool*    pAllDir = NULL;   //鍚勮酱鏂瑰悜鐢靛钩锛屽缓绔婤lock鏃惰祴鍊?

                     ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:46:21: error: 'NULL' was not declared in this scope

  bool*    pAllLev = NULL;  //鍚勮酱椹卞姩鐢靛钩鏍囪

                     ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:47:26: error: 'NULL' was not declared in this scope

  unsigned long* pAllPf = NULL;   //鎵?鏈夎酱姣忎釜鐨勬?婚儴鏁帮紝涓嶅?掓暟

                          ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:48:27: error: 'NULL' was not declared in this scope

  unsigned long* pAllPcd = NULL;  //鍚勮酱姝ユ暟鐨勬暟缁勬寚閽堬紝鎵ц鏃禼ount down

                           ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:49:27: error: 'NULL' was not declared in this scope

  unsigned long* counter = NULL;  //鍚勮酱鎻掕ˉcounter

                           ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h: In destructor 'stpBlock::~stpBlock()':

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:56:3: error: 'status' was not declared in this scope

   status = 1;

   ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:58:15: error: 'NULL' was not declared in this scope

   pLaTickCs = NULL;

               ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:63:10: error: 'pLaGroupCycle' was not declared in this scope

   delete pLaGroupCycle;

          ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h: At global scope:

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.h:81:21: error: 'NULL' was not declared in this scope

 stpBlock* pBlocks = NULL; //block鏁扮粍鎸囬拡鍏ㄥ眬鍙橀噺

                     ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:3:1: error: 'byte' does not name a type

 byte stpBlock::maxBlockIdx = 0;

 ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:4:1: error: 'byte' does not name a type

 byte stpBlock::curBlockIdx = 0;

 ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:5:1: error: 'byte' does not name a type

 byte stpBlock::Prescaler = 64;

 ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp: In member function 'void stpBlock::clear()':

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:9:2: error: 'status' was not declared in this scope

  status = 1;

  ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:11:14: error: 'NULL' was not declared in this scope

  pLaTickCs = NULL;

              ^

C:\Program Files (x86)\Arduino\libraries\bwStepper\bwStepBlock.cpp:16:9: error: 'pLaGroupCycle' was not declared in this scope

  delete pLaGroupCycle;

         ^

exit status 1
为开发板 Arduino Pro or Pro Mini 编译时出错。
qq_36260408 2018-04-27
  • 打赏
  • 举报
回复
CPP文件要添加到你工程

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧