对于一个熟手的C++码农来说,看到这样的一个问题,一下子就能反应是哪个地方代码少了一个";"。有可能是“Ctrl+C"或自己写".h"文件的某个单独函数或类是引起的。如果有svn或写的代码不复杂,定位问题相对容易,如果项目复杂,尤其是带新人,由新人引入时,能很快的定位错误,这就有点考验基本功了。首先,问题肯定不是出在algorithm.h文件,并且这个文件是std的一部分有写保护了的。
我先把编译出错的提示贴出来,再一步细数如何去定位这种问题:
1> HKCtrl.cpp
1>..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(41022): warning C4010: 单行注释包含行继续符
1>..\..\..\PublicCode\extern_include\HKCamera\Sadp.h(64): warning C4005: “MAX_FILE_PATH_LEN”: 宏重定义
1> ..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(33208) : 参见“MAX_FILE_PATH_LEN”的前一个定义
1>..\..\..\PublicCode\ExternCode\loader\IniReader.h(6): error C2144: 语法错误:“char”的前面应有“;”
1> HKLocal.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\excpt.h(29): error C2144: 语法错误:“int”的前面应有“;”
1> PersonDetect.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(12): error C2143: 语法错误 : 缺少“;”(在“namespace”的前面)
1> WidgetFaceDetect.cpp
1>.\WidgetChildBase.h(19): error C2144: 语法错误:“Ctrl5DClient”的前面应有“;”
1>..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(41022): warning C4010: 单行注释包含行继续符
1>..\..\..\PublicCode\extern_include\HKCamera\Sadp.h(64): warning C4005: “MAX_FILE_PATH_LEN”: 宏重定义
1> ..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(33208) : 参见“MAX_FILE_PATH_LEN”的前一个定义
1> moc_WidgetFaceDetect.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(12): error C2143: 语法错误 : 缺少“;”(在“namespace”的前面)
1> capturepic.cpp
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2144: 语法错误:“int”的前面应有“;”
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2146: 语法错误: 缺少“;”(在标识符“QtGuiModule”的前面)
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2371: “QtValidLicenseForGuiModule”: 重定义;不同的基类型
1> d:\qt\4.8.3\include\qtcore\../../src/corelib/global/qglobal.h(2719) : 参见“QtValidLicenseForGuiModule”的声明
1>..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(33208): warning C4005: “MAX_FILE_PATH_LEN”: 宏重定义
1> ..\..\..\PublicCode\extern_include\HKCamera\Sadp.h(64) : 参见“MAX_FILE_PATH_LEN”的前一个定义
1>..\..\..\PublicCode\extern_include\HKCamera\HCNetSDK.h(41022): warning C4010: 单行注释包含行继续符
1> 正在生成代码...
为了版面整清,可以在属性中把特定的warning屏蔽掉
然后得到:
1>------ 已启动生成: 项目: CapturePic, 配置: Debug Win32 ------
1> IniReader.cpp
1> md5.cpp
1> DataProcess.cpp
1> misc.cpp
1> tea.cpp
1> TeaLocal.cpp
1> Config.cpp
1> LoadFile.cpp
1> MGameLog.cpp
1> UsefulfunsEditor.cpp
1> UsefulFuns.cpp
1> XmlParser.cpp
1> HKCtrl.cpp
1>F:\SixAxisTheatra\Theatre_b2\PublicCode\ExternCode\loader\IniReader.h(6): error C2144: 语法错误:“char”的前面应有“;”
1> HKLocal.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\excpt.h(29): error C2144: 语法错误:“int”的前面应有“;”
1> PersonDetect.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(12): error C2143: 语法错误 : 缺少“;”(在“namespace”的前面)
1> WidgetFaceDetect.cpp
1>F:\SixAxisTheatra\Theatre_b2\SixAxisTheatra_JiYing\ControlClient\CapturePic\WidgetChildBase.h(19): error C2144: 语法错误:“Ctrl5DClient”的前面应有“;”
1> WidgetHKCam.cpp
1> WidgetChildBase.cpp
1> capturepic.cpp
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2144: 语法错误:“int”的前面应有“;”
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2146: 语法错误: 缺少“;”(在标识符“QtGuiModule”的前面)
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\qt\4.8.3\include\qtgui\../../src/gui/itemviews/qtreeview.h(51): error C2371: “QtValidLicenseForGuiModule”: 重定义;不同的基类型
1> d:\qt\4.8.3\include\qtcore\../../src/corelib/global/qglobal.h(2719) : 参见“QtValidLicenseForGuiModule”的声明
1> moc_capturepic.cpp
1> 正在生成代码...
1> 正在编译...
1> moc_WidgetChildBase.cpp
1> moc_WidgetFaceDetect.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(12): error C2143: 语法错误 : 缺少“;”(在“namespace”的前面)
1> moc_WidgetHKCam.cpp
1> main.cpp
1> 正在生成代码...
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
我们看到的文件中有很多都是std或qt里面的,跟自身代码相关的,就只有2个地方,首先定位到IniRead.h文件,显然没有可用的有效信息
然后再看第2处地方,可以看到事先声明类有红色的提示
但事实上,本工程中并没有用到此类的实现,问题陷入的困境,当时,我人也是非常疑惑,后来仔细问了一下同事(新人)也没有进行大量修改代码,怎么会这样子呢?我盯着错误看了一阵,忽然想到,提示是不是表明错误是在比较独立的头文件中出现的?我又看了一下工程中的文件列表,首先找公共性质的头文件
一下子找到了问题所在,加上了分号之后编译正常了:
总结:
这个函数原来的位置并不是在HKLocal文件夹中的,而是作为一个类的成员函数的,我当时引导同事做重构时,让抽取出来,结果同事是直接拷贝了函数实现,来作修改,结果出现了这个杯具
void WidgetFaceDetect::FaceObjToStr(const std::string& fileName, const FaceList& faceList, std::string& txt)