微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > Warning: concatenation with "=" in macro "HAL_IO_SET_PREP" does not create a valid token

Warning: concatenation with "=" in macro "HAL_IO_SET_PREP" does not create a valid token

时间:10-02 整理:3721RD 点击:

原先用IAR8.10版本编译器编译不会出现警告,然后改为9.30编译器后出现如下警告:

Warning[Pe1665]: concatenation with "=" in macro "HAL_IO_SET_PREP" does not create a valid token E:\1.MyCVS\17.Freedom XC\2.RemotePanel\13-BLE 0321\Components\hal\target\CC2540EB\hal_lcd\display_driver.c 86

这是IAR编译器版本导致的?有没有办法解决这个Warning?谢谢!

你用的是CC2540,完全没有必要9.30的版本。请按照release note的指导选择IAR版本

问题已经解决,谢谢!

##这是C语言宏定义的一种写法,起连接作用,在IO位定义或者定时器时可以用;

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )

改为:

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin= val; )

去掉pin后面的##就可以了。

其中的宏定义:

#define st(x)      do { x } while (__LINE__ == -1)


 __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的, 所以__LINE__ == -1 等同于0,化简为: #define st(x) do { x } while (0) 
2,do {} while (0)通常用于宏中, 为的是避免如下情况: #define st(x) x 那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成 if(0) a = b; b = c; 可见, b = c会任何时候都执行。
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉. 
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用

问题已经解决,谢谢!

##这是C语言宏定义的一种写法,起连接作用,在IO位定义或者定时器时可以用;

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )

改为:

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin= val; )

去掉pin后面的##就可以了。

其中的宏定义:

#define st(x)      do { x } while (__LINE__ == -1)


 __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的, 所以__LINE__ == -1 等同于0,化简为: #define st(x) do { x } while (0) 
2,do {} while (0)通常用于宏中, 为的是避免如下情况: #define st(x) x 那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成 if(0) a = b; b = c; 可见, b = c会任何时候都执行。
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉. 
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用

问题已经解决,谢谢!

##这是C语言宏定义的一种写法,起连接作用,在IO位定义或者定时器时可以用;

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )

改为:

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin= val; )

去掉pin后面的##就可以了。

其中的宏定义:

#define st(x)      do { x } while (__LINE__ == -1)


 __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的, 所以__LINE__ == -1 等同于0,化简为: #define st(x) do { x } while (0) 
2,do {} while (0)通常用于宏中, 为的是避免如下情况: #define st(x) x 那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成 if(0) a = b; b = c; 可见, b = c会任何时候都执行。
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉. 
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用

1.##是C语言宏定义的一种写法;

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )

改为:

#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin = val; )

去掉pin后面的##就可以了。

2. #define st(x)      do { x } while (__LINE__ == -1)

 __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的, 所以__LINE__ == -1 等同于0,
化简为: #define st(x) do { x } while (0) 
2,do {} while (0)通常用于宏中, 为的是避免如下情况: #define st(x) x 那么我们在调用 if (0) st(a = b; b = c;) 时
会被解释成 if(0) a = b; b = c; 可见, b = c会任何时候都执行。
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 
另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉. 
综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用.

已帮你确认答案,感谢分享经验!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top