原先用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?谢谢!
Viki Shi:
你用的是CC2540,完全没有必要9.30的版本。请按照release note的指导选择IAR版本
user4254294:
回复 Viki Shi:
问题已经解决,谢谢!
##这是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) 这个技术就是为了类似的宏可以在任何时候使用
user4254294:
回复 Viki Shi:
问题已经解决,谢谢!
##这是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) 这个技术就是为了类似的宏可以在任何时候使用
user4254294:
回复 Viki Shi:
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) 这个技术就是为了类似的宏可以在任何时候使用.
Viki Shi:
回复 user4254294:
已帮你确认答案,感谢分享经验!