事情起因
昨天花了一些时间给我的 MyTinySTL 重新弄了一套构建方案,主要是写了一个 CMakeLists.txt
(原来是写了一个简单的 Makefile
)。现在呢,在 linux/osx 下,就通过 cmake
来构建生成对应的 Makefile
,然后再 make
;在 Windows 下,就直接使用 vs
的 .sln
配置文件。具体可以看项目说明。
问题浮现
然后修改完持续集成的脚本配置之后,却出现了一个奇怪的问题:在 linux 下的构建全部失败了!
打开查看里面的信息,基本都是这样的错误提示:
gcc提示是这样的:
clang提示是这样的:
都是在 <cstring>
这个文件出错了,可这是标准库文件,怎么会出错呢?而且错误信息也很奇怪。我又去找代码查找有没有什么可能出错的地方,很久也没找到。然后跟别人请教了一下,某大神直击要害地问我:“你是不是有一个 string.h 文件?”
找到缘由
c11
中有这样一段话:
注意框出来的地方:
If a file with the same name as one of the above < and > delimited sequences, not provided as part of the implementation, is placed in any of the standard places that are searched for included source files, the behavior is undefined.
也就是说,如果有一个文件跟上述标准库文件重名,然后被包含在源文件中时,是未定义行为。
恰好,因为我写的是 tinystl,所以我写了一个 string.h
,没错,就是跟我框出来那个 <string.h>
重名了!!
解决办法就是 —— 换个名字~ 是的,然后我就把 string.h
改成了 astring.h
,问题就解决了!( ╯□╰ )
一波三折,谨以记之,提醒自己做过的傻x事情。