一: 问题产生原因
今天在码代码的时候,遇到了很多重复的短小的语句。就想着使用Macro替换。这样在代码看来整洁,短小。可是很奇葩的一件事就是怎么将数字和字符串拼接在一起。参照了之前的前辈们的代码,然后就遇到了题目所示的特奇葩的错误。
二:调试过程
在度娘中游了一遍,只是在StackFlow上看了一篇,但是最终也没有给出错误的原因。无聊的将预编译的代码打印出来看了一下,如果传入的不是直接的字符串(“”),就会出现下面的情况
只要你使用非直接的“ String ”的形式,就会在编译的时候报上面的错误。这其实和Macro的预编译替换有着直接的关系,他不会将参数的值带到里面去,故而导致了这样的编译错误。
三:解决的结果
解决的办法就是如果你使用的宏需要用到整数型,只要在前面加上个#--hash 符号就可以(这是旁边老司机教我的)。不必要将整数类型转换成字符。就可以达到要求。下面是测试的预编译结果:
从两张图的预编译结果可以明显看出来,后面才是我们使用宏的时候想要的结果。
四:下面给出自己的一些定义类型,供参考
/* Define the four lights num */
#define FIRST_LIGHT_NUM 113
#define FOURTH_LIGHT_NUM 120
#define SECOND_RED_LIGTH_NUM 16
#define SECOND_GREEN_LIGTH_NUM 121
#define THIRD_RED_LIGTH_NUM 157
#define THIRD_GREEN_LIGHT_NUM 29
#define OFF_OR_ENABLE 1
#define ON_OP_ENABLE 0
/* Macro define */
#define STRING_CREATEGPIO(GpioNum) "echo "#GpioNum" > /sys/class/gpio/export"
#define STRING_SETOUTGPIO(GpioNum) "echo \"out\" > /sys/class/gpio/gpio"#GpioNum"/direction"
#define STRING_SETOFFORON(GpioNum, Switch) "echo "#Switch" > /sys/class/gpio/gpio"#GpioNum"/value"
/* Initial the GpioNum */
#define CHANGE_LIGHT_OFF_ON(GpioNum, Switch) \
system(STRING_SETOFFORON(GpioNum, Switch)); \
/* Initial the GpioNum */
#define PREPARE_LIGHT_ACTIVE(GpioNum) \
system(STRING_CREATEGPIO(GpioNum)); \
system(STRING_SETOUTGPIO(GpioNum)); \
这里可以看到在使用#读取变量的值放到字符串中去。