博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
typedef和define混用产生的错误
阅读量:7096 次
发布时间:2019-06-28

本文共 1190 字,大约阅读时间需要 3 分钟。

最近在写代码过程中,发现一个问题,编译总是过不去,报错如下:

stdint.h:120:28: error: duplicate 'unsigned'
stdint.h:120:28: error: 'long long long' is too long for GCC

打开stdint.h这个文件,发现120行是这样的内容:

#if __have_long64typedef signed long int64_t;typedef unsigned long uint64_t;#define __int64_t_defined 1#elif __have_longlong64typedef signed long long int64_t;typedef unsigned long long uint64_t;#define __int64_t_defined 1#elif  __STDINT_EXP(INT_MAX) > 0x7ffffffftypedef signed int int64_t;typedef unsigned int uint64_t;#define __int64_t_defined 1#endif

继续查找,发现我们代码中的某一个头文件中有这样的定义:

#ifndef uint64_t#define uint64_t unsigned long long#endif

在这个头文件中,把上面这三行注释掉之后,在include<stdint.h>,编译通过。

按这个头文件名为a.h来说,在一个C文件中,我对a.h和stdint.h的关联顺序为:

#include "a.h"#include 

main函数就是一个简单的helloworld打印。

生成预处理后的文件:

gcc -E test.c -o test.i

在test.i中,发现了这样的typedef定义:

typedef unsigned long int unsigned long long;

我再把C文件中include "a.h"注释掉,test.i的对应行是这样的:

typedef unsigned long int uint64_t;

所以,发现在编译过程中,#define定义的被替换掉了,在编译时,就会报错。

但是为什么报错unsigned 和 long long long两个error,还需要进一步探索。。。我个人猜测是因为编译器的底层的原因。

总结

define在预处理阶段,typedef在编译阶段,两个头文件中都定义了uint64_t,定义方式不同,导致编译过程中,编译器认为我们声明一个long long long的数据类型。

 

转载于:https://www.cnblogs.com/zzdbullet/p/10469485.html

你可能感兴趣的文章
vsftp虚拟用户配置
查看>>
oracle11g与oracle10g字符集子集与超集的对应关系表
查看>>
登录注册D
查看>>
deepin-wine-tim 字体发虚
查看>>
windows多线程没那么难
查看>>
ID3决策树算法原理及C++实现(其中代码转自别人的博客)
查看>>
linux之SQL语句简明教程---WHERE
查看>>
霍夫变换(hough transform),从直线到圆再到一般图形
查看>>
程序员技术练级攻略--练成这样,成神仙了!
查看>>
基金净值简介
查看>>
打开myeclipse出现这个错是为什么
查看>>
mongdb使用
查看>>
Hadoop Streaming框架使用(二)
查看>>
网站升级2.0回滚机制
查看>>
centos6.9 网络配置,防火墙,复制虚拟机20180127
查看>>
h3c防火墙的设置过程
查看>>
KMP + 求最小循环节 --- HUST 1010 - The Minimum Length
查看>>
<从优秀到卓越>读书笔记
查看>>
Python3 序列解包
查看>>
C/C++ —语言判断数字或字符的函数总结
查看>>