Fork me on GitHub

C++之那些年踩过的坑(四)

事情起因

昨天花了一些时间给我的 MyTinySTL 重新弄了一套构建方案,主要是写了一个 CMakeLists.txt(原来是写了一个简单的 Makefile)。现在呢,在 linux/osx 下,就通过 cmake 来构建生成对应的 Makefile,然后再 make;在 Windows 下,就直接使用 vs.sln 配置文件。具体可以看项目说明。

问题浮现

然后修改完持续集成的脚本配置之后,却出现了一个奇怪的问题:在 linux 下的构建全部失败了!
build message
打开查看里面的信息,基本都是这样的错误提示:
gcc提示是这样的:
build message
clang提示是这样的:
build message
都是在 <cstring> 这个文件出错了,可这是标准库文件,怎么会出错呢?而且错误信息也很奇怪。我又去找代码查找有没有什么可能出错的地方,很久也没找到。然后跟别人请教了一下,某大神直击要害地问我:“你是不是有一个 string.h 文件?”

找到缘由

c11 中有这样一段话:
c11 standard headers
注意框出来的地方:

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事情。

-------------------------------- 全文完 感谢您的阅读 --------------------------------
「写的那么辛苦,连一块钱都不打赏吗/(ㄒoㄒ)/~~」