今天发现一个颇有意思的编译问题,而后在Stack Overflow上也有看到相似的。就是出现了 long long long 类型错误提示google
错误提示以下:spa
/home/yejy/algorithm_and_data_structure/main.cpp:50:17: error: ‘long long long’ is too long for GCC #define INT64 long long ^
顾名思义,一个long占4个字节,两个就是8字节,总共64位,等于系统是64位的,若是你使用3个long那就96位了,那确定会有问题,正常状况下也没人会定义三个long。code
``` #define INT64 long long ```而后看代码出错的地方,就是一个宏定义,怎么会出现问题呢? 而后仔细看了一下代码发现是连接外部库致使的,工程 A 连接了 B_lib.so 和 C_lib.so 两个动态库, 而后 B 中用宏定义了 long long , C 中使用typedef从新命名了 long long,顺序恰好是宏定义在前,等价于下面两句代码:blog
``` #define INT64 long longtypedef long long INT64;接口
<p style="font-size: 15px; text-indent:2em; letter-spacing:1px; font-family: '微软雅黑';">由于宏定义只是简单的替换,所以致使typedef变成了:</p>
typedef long long long long long;ci
<p style="font-size: 15px; text-indent:2em; letter-spacing:1px;font-weight: bold; font-family: '微软雅黑';">这应该属于比较典型的连接多个外部库致使的代码冲突问题,而后本身大概思考了一下,并到google上检索了相关问题的解决,在这里总结一下,问题的解决思路主要应该有如下几种:</p> <p style="font-size: 15px; letter-spacing:1px;font-weight: bold; font-family: '微软雅黑';">1. <font color="#FF0000">同一个项目使用同一份基础类型定义头文件</font></p> <p style="font-size: 15px; text-indent:2em; letter-spacing:1px;font-family: '微软雅黑';">在同一个项目当中,固然最好确定是全部库都引用同一个头文件中的基础类型typedef定义是最好的,这样就不会出现没必要要的冲突,在项目一开始的时候就规定好相关的基础类型定义的地方。而后由于这边是外部库,所以想把全部基础类型都定义到同一个文件不太现实,所以这种方式对于上述问题并不适用,可是若是不是外部库的话,这个仍是要注意的。整个工程都用一份,对于不一样平台能够作一下区分。</p>  <p style="font-size: 15px; letter-spacing:1px;font-weight: bold; font-family: '微软雅黑';">2. <font color="#FF0000">将问题有编译阶段推迟到连接阶段</font></p> <p style="font-size: 15px; text-indent:2em; letter-spacing:1px; font-family: '微软雅黑';">因为大部分错误都是redefinition; different basic types,固然我这个比较奇葩,这些错误都是发生在编译阶段,那咱们只要保证在编译的过程当中不冲突就能够了,也就是让两个冲突的typedef不在同一个代码文件中使用。像我这个问题,include的头文件的时候,先include包含typedef的文件,而后再include包含宏定义的文件,那编译也是能够经过的。而后对于二者彻底冲突,保证不在一个代码文件中使用就不会有问题(可考虑经过extern来隔离相关接口的定义,就是将<font color="#FF0000">调用发生冲突类型</font>的流程放到其余文件中处理)。到了连接阶段,由于这个时候都是以原始类型为基准,所以也不会有问题。若是是临时引用两个库出现问题,应该就只能经过这个方式来尝试了。</p> extern方式可参考该连接:<a href="http://brhwww.blog.163.com/blog/static/61817885201056104455163/" target="_red"><font color=#00ffff size=10>extern 隔离</font></a> <p style="font-size: 15px; letter-spacing:1px;font-weight: bold; font-family: '微软雅黑';">3. <font color="#FF0000">在C++语言中使用命名空间(namespace)</font></p> <p style="font-size: 15px; text-indent:2em; letter-spacing:1px; font-family: '微软雅黑';">这个应该是能够解决问题的,可是须要库的开发者有这个意识,对本身开发的库使用命名空间封装起来,避免与其余库或者客户代码发生冲突。这个只在C++语言里面能够使用(C语言中不存在)。</p> <p style="font-size: 15px;text-indent:60em;letter-spacing:1px; font-family: '微软雅黑';">2018年9月27日20:52:02</p>