如何评估#define中的逗号

时间:2016-06-12 20:16:19

标签: c c-preprocessor pic xc8

我正在使用XC8编译器开发带有PIC的小型嵌入式应用程序。在XC8中设置引脚(输出或输入)的使用,程序员应该执行如下指令:

TRISAbits.RA0 = 1;

特别是:

  • TRIS在寄存器的前缀(常量)
  • A是端口
  • bits是后缀(常量)
  • RA0是图钉
  • 的名称

我想要做的是用人类可读的名称定义所有引脚,例如:

#define LED_1     A,RA0
#define LED_2     A,RA1
#define SWITCH_1  B,RB5
...

并定义一些以这种方式使用的SET_OUTPUTSET_INPUT宏:SET_OUTPUT(LED_1)

我试图做的是这两个宏:

#define SET_INPUT(port, pin)  TRIS ## port ## bits. ## pin ## = 0

但是,先前定义的常量中的逗号不会扩展并解释为单个参数。我也试过了:

#define SET_INPUT(X)  SET_INPUT_(X ## "")
#define SET_INPUT_(port, pin)  TRIS ## port ## bits. ## pin ## = 0

没有成功。

基本上与这个问题相反:Comma in C/C++ macro

是否存在解决方案或更方便的方法?

1 个答案:

答案 0 :(得分:2)

你很亲密:

#define SET_INPUT(X)  SET_INPUT_(X)
#define SET_INPUT_(port, pin)  TRIS ## port ## bits.pin = 1

##仅用于粘贴两个令牌以形成另一个令牌。对于您没有形成新令牌的情况(例如bits.pin),您不需要做任何特别的事情。

我建议statement-izing the macro

#define SET_INPUT_(port, pin)  do { TRIS ## port ## bits.pin = 1; } while (0)