使用字符串检查宏定义

时间:2011-12-27 11:56:40

标签: c macros c-preprocessor microcontroller

我不确定是否可以这种方式使用宏。

在我的嵌入式系统项目中,我想知道是否定义了一个宏,具体取决于我拥有的两个字符串。

例如:

#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 {}

请指导是否可以使用宏,因为只能像这样定义引脚。

另外,如果没有,那么还有其他办法吗?

3 个答案:

答案 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