我不确定是否可以这种方式使用宏。
在我的嵌入式系统项目中,我想知道是否定义了一个宏,具体取决于我拥有的两个字符串。
例如:
#define FAN_1 PORTAbits.RA0
#define LIGHT_1 PORTAbits.RA1
现在,当我收到以下形式的请求时:
char *arg1="FAN"; ("LIGHT")
char *arg2="1";
使用这两个参数我想直接检查我的风扇1连接的引脚并检查其状态。
我想要一种方法,这样我就不必使用strcmp()或直接匹配来检查arg1和arg2。
我可以直接写if(some_macro(arg1,arg2)==1){} else {}
。
请指导是否可以使用宏,因为只能像这样定义引脚。
另外,如果没有,那么还有其他办法吗?
答案 0 :(得分:4)
不,不能像这样使用宏。宏是预处理器功能,在编译代码之前由预处理器进行扩展。听起来您收到的请求只在运行时才知道。如果此信息仅在运行时已知,则无法在预处理器时检查请求是针对FAN_1还是LIGHT_1。您需要使用条件检查来确定请求的用途。
根据引脚组的名称(“FAN”,“LIGHT”等),仅打开arg1
的第一个字符或者前几个字符可能就足够了。此外,您可以切换其中的字符,而不是将arg2
完全解析为整数。这样您就可以识别所请求的图钉,而无需拨打strcmp()
或atoi()
。
答案 1 :(得分:1)
C预处理器无权访问任何变量的值。但您可以使用环境变量而不是宏:
putenv("FAN_1", "PORTAbits.RA0")
putenv("LIGHT_1", "PORTAbits.RA1")
然后:
if (getenv(construct(arg1, arg2)) != NULL) {} else {}
其中construct(arg1, arg2)
函数返回字符串arg1
,"_"
和arg2
的连接。
答案 2 :(得分:0)
GCC支持宏字符串化: 3.4 Stringification