请问这个头文件有啥问题,编译总是无法通过

zcj2247 2012-04-27 03:58:01
RT

#ifndef  __SPLIT_H_
#define __SPLIT_H_
#endif //__SPLIT_H_
void StringSplit(string s,char splitchar,vector<string>& vec)
{
if(vec.size()>0)//保证vec是空的
vec.clear();
int length = s.length();
int start=0;
for(int i=0;i<length;i++)
{
if(s[i] == splitchar && i == 0)//第一个就遇到分割符
{
start += 1;
}
else if(s[i] == splitchar)
{
vec.push_back(s.substr(start,i - start));
start = i+1;
}
else if(i == length-1)//到达尾部
{
vec.push_back(s.substr(start,i+1 - start));
}
}
}


报错内容

In file included from a.cpp:24:
split.h:23: error: variable or field `StringSplit' declared void
split.h:23: error: `string' was not declared in this scope
split.h:23: error: expected primary-expression before "char"
split.h:23: error: `vector' was not declared in this scope
split.h:23: error: `string' was not declared in this scope
split.h:23: error: `vec' was not declared in this scope
split.h:24: error: initializer expression list treated as compound expression
split.h:24: error: expected `,' or `;' before '{' token
...全文
236 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-04-27
  • 打赏
  • 举报
回复
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。
bsnry 2012-04-27
  • 打赏
  • 举报
回复
也可以不必。

在cpp里加也行。

呵呵


另外也可以用#pragma once


[Quote=引用 2 楼 的回复:]
而且需要包含头文件.
所以要加上下面的:
#include<vector>
#include<string>
using namespace std;
[/Quote]
翅膀又硬了 2012-04-27
  • 打赏
  • 举报
回复
楼上的说的对
evencoming 2012-04-27
  • 打赏
  • 举报
回复
而且需要包含头文件.
所以要加上下面的:
#include<vector>
#include<string>
using namespace std;
evencoming 2012-04-27
  • 打赏
  • 举报
回复
#endif应该放在文件尾部.修改如下:
[code=C/C++]
#ifndef __SPLIT_H_
#define __SPLIT_H_
void StringSplit(string s,char splitchar,vector<string>& vec)
{
if(vec.size()>0)//保证vec是空的
vec.clear();
int length = s.length();
int start=0;
for(int i=0;i<length;i++)
{
if(s[i] == splitchar && i == 0)//第一个就遇到分割符
{
start += 1;
}
else if(s[i] == splitchar)
{
vec.push_back(s.substr(start,i - start));
start = i+1;
}
else if(i == length-1)//到达尾部
{
vec.push_back(s.substr(start,i+1 - start));
}
}
}
#endif //__SPLIT_H_

[/CODE]
我发现mpu6050例程中,必须要有usart.h否则函数编译虽然不报错,但是程序执行不了。为什么我这么说嗯,我对我做的尝试做如下的说明。我是针对正点原子的MPU6050战舰版例程进行的测试。 1、remove左边SYSTEM文件夹下的usart文件,见图1,当然也移除了usmart文件夹(此实验中没有实际用处) 2、屏蔽掉LCD中用到串口1的地方(主要就是打印LCD型号的地方),见图2.1和2.2 3、屏蔽掉所有用到usart.h的子文件,如图3中上面的四个头文件,他们都包含了usart.h,都注释掉,这里特别说明需要额外注释掉主程序test.c中的一些向上位机传递数据的一些函数。 4、以上三步完成后,编译程序,程序无错误和警告。下载到战舰开发板中,发现液晶屏不亮,无法显示陀螺仪数据。 5、为了验证问题所在,采用流水灯指示程序的运行状态,不断向上调节LED的位置,直到LED调整到LED初始化下面的时候,编译下载程序开发板上的LED都不亮。至此可以说明有些LED初始化上面某地方有问题,但LED初始化上面仅仅有#include和一些变量的初始化。变量初始化不可能引起问题。 6、进行ST-LINK的硬件调试,发现问题可能由6050导致。 7、于是我用其他的不含6050的程序(例如跑马灯例程),移除usart文件和注释所有含有usart.h的地方,下载运行程序,程序正常运行跑马灯正常运行。 8、经过以上7步的测试可以认为,问题在于mpu6050和usart.h存在潜在的联系,虽然不用调用usart.h。但是是什么联系呢 9、于是我重新加入了第一步中移除的SYSTEM文件夹下的usart,但是其他的地方不变,就是其他所有用到usart.h头文件的地方依旧注释掉,编译没有错误,下载,流水灯亮,液晶屏显示mpu6050数据。所以验证了第8步的猜想,存在着潜在的不为人知的联系。 10、为了知道是什么联系,我不断的删除usart.c和usart.h中的的内容,最终发现,只有当usart.c中保留如下图5,所示的20几行看不懂的程序的时候,mpu6050一切可以运行正常。 经过这里我所有的尝试基本上完成了,接下来抛出我的几个问题 1、第十步中的那20行程序到底是干什么用的呢? 2、为什么那20几行程序仅仅影响了当程序中含有mpu6050时的程序呢? 3、既然mpu6050的三个相关的文件中包含了usart.h的头文件,那为啥注释掉后没有报错呢? 4、mpu6050到底和usart.h中的那20行程序存在什么关系呢? 再想起什么问题,会在下面补充,我把尝试的代码也附在下面,方便大家尝试验证。 最后希望大家能一起讨论一起进步,第一次在论坛写这么多文字,也希望大家多多支持吧。

64,648

社区成员

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

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