typedef重复定义 和 error: ‘long long long’ is too long for GCC
今天发现一个很有意思的编译问题,然后在Stack Overflow上也有看到类似的。就是出现了 long long long 类型错误提示
错误提示如下:
/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。
```
#define INT64 long long
```
然后看代码出错的地方,就是一个宏定义,怎么会出现问题呢? 然后仔细看了一下代码发现是链接外部库导致的,工程 A 链接了 B_lib.so 和 C_lib.so 两个动态库, 然后 B 中用宏定义了 long long , C 中使用typedef重新命名了 long long,顺序刚好是宏定义在前,等价于下面两句代码:
```
#define INT64 long long
typedef long long INT64;
<p style="font-size: 15px; text-indent:2em; letter-spacing:1px; font-family: '微软雅黑';">因为宏定义只是简单的替换,因此导致typedef变成了:</p>
typedef long long long long long;
<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>
typedef重复定义 和 error: ‘long long long’ is too long for GCC的更多相关文章
- 编译器重复定义错误:error C2371: 'SIZE' : redefinition; different basic types
我们常常会定义自己工程用的数据类型,可能会与Windows的基本数据类型冲突. vs会报重复定义错误:error C2371: 'SIZE' : redefinition; different bas ...
- 自定义C/C++头文件以及头文件重复定义解决
今天再看二叉树的知识,看着看着就看到C/C++的头文件及头文件重复定义这一块去了.以前就看到过这个问题,但是自己一直没有用到这方面的东西,今天遇到就顺便总结一下,等以后忘了再回来看看. 首先明确一点C ...
- typedef 各类定义,各类问题大全
第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...
- keil C51中建立多文件时,变量重复定义的解决
c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下. 对于比较小的程序,一般只有一个c文件和一个头文件,全局变量 ...
- 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载
解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...
- extern 用法,全局变量与头文件(重复定义)
转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int ...
- LNK2005错误——重复定义错误
编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误.弄清楚它形成的原因,就可以轻松解决它了. 造成LNK2005错误主要有以下几种情况: 1.重复定义全 ...
- link2005 重复定义错误
造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量. 对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的. 正 ...
- keil的重复定义问题:Error: L6200E: Symbol F6x8 multiply defined
keil的重复定义问题:Error: L6200E: Symbol F6x8 multiply defined 在驱动oled和电容按键都遇到了,所以记录这个错误,以后再遇到也不至于手足无措 Keil ...
随机推荐
- DLL分配的内存如何在EXE里面释放
总结下面几个要点: 1. 保证内存分配和清除的统一性:如果一个DLL提供一个能够分配内存的函数,那么这个DLL同时应该提供一个函数释放这些内存.数据的创建和清除应该在同一个层次上. 曾经遇到过这样的例 ...
- js的NaN变量
js中,我们经常在parseInt函数的时候遇到NaN变量,这个变量到底是什么呢? w3c上这样解释: NaN 属性是代表非数字值的特殊值.该属性用于指示某个值不是数字.可以把 Number 对象设置 ...
- 笔记-JavaWeb学习之旅2
数据库的基本概念 1.数据库:DataBase 简称 DB,用于存储和管理数据的仓库 特点: 1.持久化存储数据的,其实数据库就是一个文件系统, 2.方便存储和管理数据 3.使用了统一操作数据库 -- ...
- GitHub笔记---邮箱访问错误
GitHub地址太长,所以需要一个变量来保存 把远程仓库赋值给一个变量,以后就用就这变量代表这个地址 GitHub推送push 推送过程中发生一个小插曲,出现了错误,错误提示我复制过来吧 remote ...
- MVC 感触
这几天接触了下 ef+ MVC+WEBAPI +bootstrop VIEW--->Controller -->WebAPI ---Model (Linq) 记住 VIEW里的 csh ...
- 写一个类继承socket时遇到的问题(TCP)
主要为题出在服务器端的accept()函数,他返回两个参数,一个套接字和一个客户端的ip和端口组成的元组. 问题就出在这个套接字这里,我们继承了socket这个类,这个套接字创建的时候是通过socke ...
- 模拟 Codeforces Round #297 (Div. 2) A. Vitaliy and Pie
题目传送门 /* 模拟:这就是一道模拟水题,看到标签是贪心,还以为错了呢 题目倒是很长:) */ #include <cstdio> #include <algorithm> ...
- magento 开启 3D secure credit card validation
因为国外盗刷严重,于是得开启验证. 首先可以去 https://developer.cardinalcommerce.com/try-it-now.shtml.这上面有测试账号,截图如下:
- Spark MLlib编程API入门系列之特征选择之卡方特征选择(ChiSqSelector)
不多说,直接上干货! 特征选择里,常见的有:VectorSlicer(向量选择) RFormula(R模型公式) ChiSqSelector(卡方特征选择). ChiSqSelector用于使用卡方检 ...
- ASP.NET MVC5的一个轻量级的框架学习的第一天
第二步第三部 这是第一天的小试成功,怪自己太笨了,一个错排查好久,还好有源码看着了解,后续还得多努力,