typedef重复定义 和 error: ‘long long long’ is too long for GCC

博客讨论了在C/C++编程中遇到的typedef冲突问题,特别是涉及到'long long long'类型定义导致的错误。问题源于链接不同库时,宏定义和typedef的顺序导致的代码冲突。提出了三种解决方案:1) 使用统一的基础类型定义头文件;2) 延迟编译阶段的冲突,确保冲突的typedef不在同一文件中;3) 在C++中利用命名空间避免冲突。文章来源于2018年的博客分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天发现一个很有意思的编译问题,然后在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;

因为宏定义只是简单的替换,因此导致typedef变成了:

typedef long long long long long;

这应该属于比较典型的链接多个外部库导致的代码冲突问题,然后自己大概思考了一下,并到google上检索了相关问题的解决,在这里总结一下,问题的解决思路主要应该有以下几种:

1. 同一个项目使用同一份基础类型定义头文件

在同一个项目当中,当然最好肯定是所有库都引用同一个头文件中的基础类型typedef定义是最好的,这样就不会出现不必要的冲突,在项目一开始的时候就规定好相关的基础类型定义的地方。然后因为这边是外部库,因此想把所有基础类型都定义到同一个文件不太现实,因此这种方式对于上述问题并不适用,但是如果不是外部库的话,这个还是要注意的。整个工程都用一份,对于不同平台可以做一下区分。

1285081-20180927202250779-1847015286.png

2. 将问题有编译阶段推迟到链接阶段

由于大部分错误都是redefinition; different basic types,当然我这个比较奇葩,这些错误都是发生在编译阶段,那我们只要保证在编译的过程中不冲突就可以了,也就是让两个冲突的typedef不在同一个代码文件中使用。像我这个问题,include的头文件的时候,先include包含typedef的文件,然后再include包含宏定义的文件,那编译也是可以通过的。然后对于两者完全冲突,保证不在一个代码文件中使用就不会有问题(可考虑通过extern来隔离相关接口的定义,就是将调用发生冲突类型的流程放到其他文件中处理)。到了链接阶段,因为这个时候都是以原始类型为基准,因此也不会有问题。如果是临时引用两个库出现问题,应该就只能通过这个方式来尝试了。

extern方式可参考该链接:extern 隔离

3. 在C++语言中使用命名空间(namespace)

这个应该是可以解决问题的,但是需要库的开发者有这个意识,对自己开发的库使用命名空间封装起来,避免与其他库或者客户代码发生冲突。这个只在C++语言里面可以使用(C语言中不存在)。

2018年9月27日20:52:02

转载于:https://www.cnblogs.com/blog-yejy/p/9715304.html

### 关于 `typedef int long long` 的用法含义 在 C C++ 中,`typedef` 是一种用于创建类型别名的关键字。它的主要作用是简化复杂类型的声明或者提高代码的可读性移植性。 #### 1. **语法结构** `typedef` 的基本形式如下: ```c typedef existing_type new_name; ``` 这意味着可以为现有的数据类型定义一个新的名称(别名)。例如: ```c typedef unsigned int uint; ``` 上述语句表示将 `unsigned int` 类型命名为 `uint`[^3]。 #### 2. **关于 `typedef int long long`** 如果尝试写成 `typedef int long long`,这实际上是不符合标准 C 或 C++ 的语法规则的。原因在于,在 C/C++ 中,`long long` 已经是一个完整的类型关键字组合,而不能被拆分为单独的部分来重新定义。因此,这种写法会引发编译错误。 正确的做法应该是这样: ```c typedef long long ll; ``` 这条语句的作用是为 `long long` 类型创建了一个新的名字 `ll`,从而可以在后续代码中更方便地使用该类型[^4]。 #### 3. **实际应用案例** 下面展示如何利用 typedef 定义新类型并加以运用的例子: ```c #include <stdio.h> // 创建 'll' 作为 'long long' 的同义词 typedef long long ll; int main() { ll number = 9223372036854775807LL; // 使用最大可能的 long long 值 printf("The value is %lld\n", number); return 0; } ``` 在这个例子中,通过 `typedef` 将 `long long` 设置成了更容易记忆的名字 `ll`,使得程序更加简洁明了[^5]。 #### 4. **与站内引用的关系分析** 虽然提供的两个引用并未直接涉及 `typedef int long long` 这一具体话题,但从它们可以看出 `typedef` 在不同场景下的灵活性以及重要性。比如第一个引用展示了如何借助 `struct` 结合指针变量构建自定义复合类型;第二个引用则是围绕未托管 API 展开讨论,强调了跨平台开发过程中统一接口描述的需求[^1][^2]。 综上所述,合理使用 `typedef` 不仅能够提升编码效率,还能增强软件系统的兼容性维护便利度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值