打印
[C语言]

看不懂的C语言define和typedef

[复制链接]
3500|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 impig33 于 2018-3-4 18:13 编辑



红圈处,这里的
#define u8 unit8_t



和后面一句
typedef unsigned char unit8_t

分别起到什么作用? 请解释一下。


谢谢!

.

相关帖子

沙发
lfjwfm| | 2018-2-3 15:47 | 只看该作者
define就是直接替换,比如你写U8,那么编译器自动把u8替换成UINT8_T而已,这样简写打字快,懒惰的程序员想出来的小把戏。

下面那个是定义unit8_t,两层其实都是一个意思:可以少打几个字,偷懒而已啊

使用特权

评论回复
板凳
caijie001| | 2018-2-3 19:00 | 只看该作者
【知识】单片机C语言知识用法之#define
https://bbs.21ic.com/icview-2405600-1-1.html?fromuid=1875788

希望对你有帮助

使用特权

评论回复
地板
linqing171| | 2018-2-3 20:44 | 只看该作者
首先 define 后面跟 两个内容, 第二个替换第一个。
其次 typedef 后面跟两个内容,是第一个替换第二个。

define 可以替换、拼接任意的内容;而typedef只能替换类型。

使用特权

评论回复
5
junyee| | 2018-2-4 10:29 | 只看该作者
个人理解,词汇使用不一定准确,仅供参考,欢迎纠错:

带# 的是预处理片段,
而 typedef 是代码段,行尾需要加";"

#defin A a       //编译前把所有A 替换成 a
typedef a A;     //产生结构同a的新类型 A

使用特权

评论回复
6
caijie001| | 2018-2-4 11:30 | 只看该作者
junyee 发表于 2018-2-4 10:29
个人理解,词汇使用不一定准确,仅供参考,欢迎纠错:

带# 的是预处理片段,

是#define

使用特权

评论回复
7
caijie001| | 2018-2-4 11:33 | 只看该作者
junyee 发表于 2018-2-4 10:29
个人理解,词汇使用不一定准确,仅供参考,欢迎纠错:

带# 的是预处理片段,

#define      标识符    被标识符代表的字符串      //这种用法很简单,就是一种替换
#define    ADD_NUM     10
就是用ADD_NUM表示10
在程序中   我们可以不需要写10这个数字
可以直接写ADD_NUM     
使得程序更便于理解

使用特权

评论回复
8
caijie001| | 2018-2-4 11:33 | 只看该作者
#define      标识符    被标识符代表的字符串      //这种用法很简单,就是一种替换
#define    ADD_NUM     10
就是用ADD_NUM表示10
在程序中   我们可以不需要写10这个数字
可以直接写ADD_NUM     
使得程序更便于理解

使用特权

评论回复
9
574997859| | 2018-2-4 11:50 | 只看该作者
宏定义纯字符替代
类型定义就不一样了,编译器会检查是否重复或出错。

使用特权

评论回复
10
junyee| | 2018-2-5 07:52 | 只看该作者

南方天冷,室温3度,手僵,键盘少敲字了。

使用特权

评论回复
11
junyee| | 2018-2-5 07:56 | 只看该作者
#define  
宏定义常用来替换常数,代码(段),增加代码的可阅读、可移植性。

使用特权

评论回复
12
caijie001| | 2018-2-5 08:31 | 只看该作者
junyee 发表于 2018-2-5 07:52
南方天冷,室温3度,手僵,键盘少敲字了。

使用特权

评论回复
13
wkshengren| | 2018-2-5 08:45 | 只看该作者
本帖最后由 wkshengren 于 2018-5-21 09:44 编辑

#define 是在编译时替换,可以做任何替换
typedef 是定义新的类型,只能定义类型,但是不是简单替换,有的编译器会认为typedef后的类型跟原类型不是一个类型,会要求强制转换类型
比如
typedef unsigned char uint8_t
unsigned char a = 10;
uint8_t b;
b = a;
这时有的编译器会产生warning,表明类型不一样,需要强制转换
b = (uint8_t)a;

使用特权

评论回复
14
impig33|  楼主 | 2018-2-5 10:17 | 只看该作者
junyee 发表于 2018-2-5 07:52
南方天冷,室温3度,手僵,键盘少敲字了。

谢谢

使用特权

评论回复
15
gujiamao12345| | 2018-2-5 11:24 | 只看该作者
一个是文本替换,一个是重命名

使用特权

评论回复
16
一路向北lm| | 2018-2-5 14:52 | 只看该作者
2楼杰杰的资料不错,楼主跟他混。

使用特权

评论回复
17
impig33|  楼主 | 2018-3-4 18:08 | 只看该作者
本帖最后由 impig33 于 2018-3-4 18:19 编辑

根据各位的回复,我猜测下面两句意思是这样的:
typedef unsigned char unit8_t;
#define u8 unit8_t;

上一句是定义了一种unit8_t的新类型,类型其实是unsigned char的别名。
下一句是因为unit8_t太长了书写麻烦,所以定义了一个宏u8,其实还是调用的unit8_t。


那么问题来了:
1.按照程序初始化过程
#define u8 unit8_t;
typedef unsigned char unit8_t;

图中的代码是先#define后typedef的,是不是搞反了?

2.两句能不能简写成一句
typedef unsigned char u8


谢谢各位的指导

@caijie001 @lfjwfm @linqing171 @junyee @574997859 @wkshengren @gujiamao12345 @一路向北lm

使用特权

评论回复
18
junyee| | 2018-3-5 08:49 | 只看该作者
本帖最后由 junyee 于 2018-3-5 09:03 编辑
impig33 发表于 2018-3-4 18:08
根据各位的回复,我猜测下面两句意思是这样的:
typedef unsigned char unit8_t;
#define u8 unit8_t;

#楼上

你发帖时间距现在1个月了,这么久还没搞明白吗???

带# 号的是预定义,
你可以理解为在读代码前要处理的部分.
处理完了 #号开头的行或段落后,再看代码是什么意思.

#define 是取小名
typedef 是命名类
#define 曹操字孟德小名阿瞒 cc
typedef 定义一个读音像曹操的人 caocao;

caocao 曹超;
caocao 操草;
caocao cc;  //这个才是三国里的曹操


看似作用相同,但侧重点不一样.
#define 可以替换很多东西,数字,符号,字符串,代码段,甚至是空(常用).

#define number 12345
#define string "hello,world"
#define code led=1;
#define fragment for(u8 i=0;i<10;i++) {\
                          led ^= 1; \
                        }
#define callFunc(a,b) call2(b,a)
#define isVar

当然除此之外还有许多用法,,,

typedef 语句,一般来说行尾要加分号.
typdef 123456 num;

像这个就是错误的.

使用特权

评论回复
19
ddllxxrr| | 2018-3-5 09:00 | 只看该作者
前一句用U8代替unsigned int8_t,后者定义unsigned int8_t

使用特权

评论回复
20
574997859| | 2018-3-5 11:04 | 只看该作者
impig33 发表于 2018-3-4 18:08
根据各位的回复,我猜测下面两句意思是这样的:
typedef unsigned char unit8_t;
#define u8 unit8_t;

1.按照程序初始化过程 #define u8 unit8_t; typedef unsigned char unit8_t;  图中的代码是先#define后typedef的,是不是搞反了?  

2.两句能不能简写成一句 typedef unsigned char u8
-------------------------------------------------------------------------------------------
第一个问题,#define后面是不建议加分号的。define你可以看成是纯替代,用u8替代uint8_t。编译器会自己帮你替代上去。
第二个问题,可以这么做。你都可以定义typedef unsigned char u8,typedef unsigned char uint8_t同时存在。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

67

帖子

0

粉丝