5107|14

253

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

#if 后面不能由强制类型转换怎么办? [复制链接]

#define NUM (unsigned int)0xcccccccc

#if (NUM>0)



#endif

报错:

error: token is not a valid binary operator in preprocessor subexpression

去掉(unsigned int)就正常,怎么办?
此帖出自ARM技术论坛

最新回复

因为我是考虑到unsigned int的范围是(0~(2^32)-1),所以才那么说的。  详情 回复 发表于 2015-6-24 08:54
点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
你的编译器和开发工具是什么?
此帖出自ARM技术论坛

点评

keil和VC6这两个  详情 回复 发表于 2015-6-22 16:38
 
 
 

回复

6423

帖子

17

TA的资源

版主

板凳
 
感觉是你的#define有问题,加个括号试试,这样((unsigned int)0xcccccccc)
此帖出自ARM技术论坛

点评

[attachimg]203020[/attachimg][attachimg]203021[/attachimg][attachimg]203022[/attachimg]  详情 回复 发表于 2015-6-22 16:42
 
个人签名training
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 
本帖最后由 freebsder 于 2015-6-21 23:37 编辑

之前有个关于macro的精华帖,我称之为关公战秦琼,内容也有问题,解释也有问题,和你这个有类似情况。
所有的C编译环境,有一个很基本的情况你肯定知道:宏处理然后编译,他们是2个阶段,2个阶段。
虽然具体处理方式各个编译环境有不同,可是编译行为大家都得根据C的潜规则、约定和标准来。以unix为例,在宏处理阶段,是由cpp处理;编译阶段,是由cc处理。名字不是关键,甚至可以只由一个程序来处理(只是预处理和编译这个顺序在这个程序里自己分割)。
重点是,所有的C编译环境都划分出预处理和编译,我们太通常的把这个环境统称为C编译器,可到底这个“编译器”是什么东西有什么东西,应该知道。既然宏处理和编译是两个可以独立的过程,那么你为什么要用编译阶段的语法,来思考预处理阶段的语意?这就是说为什么是关公战秦琼。(unsigned int)这种编译阶段的东西,就不应该让预处理器去处理。准确的说,预处理器的#if 不支持这样的语法。
此帖出自ARM技术论坛

点评

我又想到了一个做法,就是在表达式中强制类型转换,这样预编译器就处理不到了,貌似可以哟,就是写起来没有一开始就声明好便捷  详情 回复 发表于 2015-6-22 08:14
但是还有一个问题,不是我想让预编译器处理,而是有的代码中#if后面接一个宏,而这个宏又被定义成了强制类型转换的,结果就报错,我刚开始的做法是把强制类型转换删了,可是不放心,怎么办呢?我现在的做法是在十六  详情 回复 发表于 2015-6-22 08:11
”(unsigned int)这种编译阶段的东西,就不应该让预处理器去处理。准确的说,预处理器的#if 不支持这样的语法。“ 大神牛逼,秒懂  详情 回复 发表于 2015-6-22 08:05
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

5
 
freebsder 发表于 2015-6-21 23:22
之前有个关于macro的精华帖,我称之为关公战秦琼,内容也有问题,解释也有问题,和你这个有类似情况。
所 ...

”(unsigned int)这种编译阶段的东西,就不应该让预处理器去处理。准确的说,预处理器的#if 不支持这样的语法。“
大神牛逼,秒懂
此帖出自ARM技术论坛
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

6
 
freebsder 发表于 2015-6-21 23:22
之前有个关于macro的精华帖,我称之为关公战秦琼,内容也有问题,解释也有问题,和你这个有类似情况。
所 ...

但是还有一个问题,不是我想让预编译器处理,而是有的代码中#if后面接一个宏,而这个宏又被定义成了强制类型转换的,结果就报错,我刚开始的做法是把强制类型转换删了,可是不放心,怎么办呢?我现在的做法是在十六进制数后面加u,如0x22222222u,这样就不报错了,请问大神这样和(uint32_t)转换有区别吗?毕竟它只是加了个u,具体是u32还是u16,是不是没法控制?
此帖出自ARM技术论坛

点评

有区别,一个是数的表示是数是什么,一个是转换是你怎么看这个数。至于多大,什么符号,这得查查,记不得了。  详情 回复 发表于 2015-6-22 16:02
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

7
 
freebsder 发表于 2015-6-21 23:22
之前有个关于macro的精华帖,我称之为关公战秦琼,内容也有问题,解释也有问题,和你这个有类似情况。
所 ...

我又想到了一个做法,就是在表达式中强制类型转换,这样预编译器就处理不到了,貌似可以哟,就是写起来没有一开始就声明好便捷
此帖出自ARM技术论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

8
 


有区别,一个是数的表示是数是什么,一个是转换是你怎么看这个数。至于多大,什么符号,这得查查,记不得了。
此帖出自ARM技术论坛

点评

恩,明白了,感谢  详情 回复 发表于 2015-6-22 16:38
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

9
 
freebsder 发表于 2015-6-22 16:02
有区别,一个是数的表示是数是什么,一个是转换是你怎么看这个数。至于多大,什么符号,这得查查,记不得 ...

恩,明白了,感谢
此帖出自ARM技术论坛
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

10
 
dcexpert 发表于 2015-6-21 21:42
你的编译器和开发工具是什么?

keil和VC6这两个
此帖出自ARM技术论坛
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

11
 
本帖最后由 白手梦想家 于 2015-6-22 16:44 编辑
白丁 发表于 2015-6-21 22:46
感觉是你的#define有问题,加个括号试试,这样((unsigned int)0xcccccccc)



悬停的时候才有那个 token...的提示,截图不下来。


此帖出自ARM技术论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

12
 
unsigend int范围是0~(2^32)-1,你的0xcccccccc已经超出unsigend int范围了吧
此帖出自ARM技术论坛

点评

unsigned int不是 0xffffffff ?你确定?  详情 回复 发表于 2015-6-24 08:10
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

13
 
本帖最后由 白手梦想家 于 2015-6-24 08:33 编辑
huaiqiao 发表于 2015-6-22 21:06
unsigend int范围是0~(2^32)-1,你的0xcccccccc已经超出unsigend int范围了吧

unsigned int不是 0xffffffff >0xcccccccc?你确定? int在Dos里面是16bit,在windows以及KEIL MDK中都是32bit
另外换任何数都报错,不信你可以试试。
此帖出自ARM技术论坛

点评

因为我是考虑到unsigned int的范围是(0~(2^32)-1),所以才那么说的。  详情 回复 发表于 2015-6-24 08:54
 
 
 

回复

253

帖子

1

TA的资源

一粒金砂(高级)

14
 
我认为编译器预处理不够强大,比如只有#if,没有#for,这样的话写代码可能更轻松,个人观点。
此帖出自ARM技术论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

15
 
白手梦想家 发表于 2015-6-24 08:10
unsigned int不是 0xffffffff >0xcccccccc?你确定? int在Dos里面是16bit,在windows以及KEIL MDK中都是 ...

因为我是考虑到unsigned int的范围是(0~(2^32)-1),所以才那么说的。
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表