2011-12-27 107 views
0

我不确定是否可以以这种方式使用宏。使用字符串检查宏定义

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

对于如:

#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

这看起来很像微型芯片PIC代码。如果您使用的是MPLAB C编译器和库,请注意RAM与ROM中的字符串之间的区别。传递给函数的字符串常量将由'char rom *'而不是'char *'进行传递。对于每种类型的字符串比较,它们的库中都有特殊的函数。例如:'strcmppgm2ram(arg1,“FAN”)'将arg1与字符串文字进行比较是正确的。我不确定其他C编译器如何处理奇怪的内存结构。 – 2011-12-27 19:52:18

回答

4

不,宏不能像这样使用。宏是一个预处理器功能,它在编译代码之前被预处理器扩展。这听起来像你收到的请求只在运行时才知道。如果此信息仅在运行时已知,则无法在预处理器时间检查请求是针对FAN_1还是LIGHT_1。您需要使用条件检查来确定请求的用途。

根据引脚存储库的名称(“FAN”,“LIGHT”等),仅打开arg1的第一个字符或可能是前几个字符就足够了。另外,也可以将arg2完全解析为整数,而不是将其切换为字符。这将允许您识别正在请求的引脚而无需致电strcmp()atoi()

+0

以更全面的答案+1击败我8秒。 – 2011-12-27 12:09:26

+0

谢谢Daniel!我不能在arg1的第一个字符处切换,因为我还需要验证请求是被接受还是被拒绝。为此我必须检查拼写完整的“粉丝”和“光明”你对arg2是正确的。 – user1117564 2011-12-27 12:17:41

1

C预处理器无法访问任何变量的值。但是你可以使用环境变量,而不是宏:

putenv("FAN_1", "PORTAbits.RA0") 
putenv("LIGHT_1", "PORTAbits.RA1") 

然后:

if (getenv(construct(arg1, arg2)) != NULL) {} else {} 

construct(arg1, arg2)函数返回一个字符串arg1"_"arg2的级联。

+0

'construct'在这种情况下可能会泄漏内存。 – 2011-12-27 12:30:09

+3

他可能在PIC上没有putenv()或getenv():)。 – 2011-12-27 16:32:59

+0

右布赖恩..我没有这样的方法。你能建议任何其他方式来做到这一点吗? – user1117564 2012-01-06 17:19:17