【发布时间】:2017-11-07 09:58:26
【问题描述】:
我有一组像这样的#defines:
#define MODULE1_PINMASK 0x1
#define MODULE2_PINMASK 0x2
#define MODULE3_PINMASK 0x3
其中 pinmask 的值取决于以下参数的第二个参数:
#define MODULE1_PORT_PIN A,1
#define MODULE2_PORT_PIN A,2
#define MODULE3_PORT_PIN A,3
如果在未来的任何时候,我会做出改变,例如:
#define MODULE1_PORT_PIN A,1 /* changes to #define MODULE1_PORT_PIN A,4 */
我还需要更改 pinmask:
#define MODULE1_PINMASK 0x1 /* then becomes #define MODULE1_PINMASK 0x4 */
我正在尝试通过不必手动更改 pinmask 来自动化该过程。到目前为止,我已经有了这些宏来提取 MODULEX_PORT_PIN 的第二个参数(在这种情况下我不关心第一个参数):
#define GET_SECOND(X, Y) Y
#define GET_PIN(PORT_PIN) GET_SECOND(PORT_PIN)
如果我在函数中使用它们,我会得到正确的结果,例如:
uint8_t pinmask=0x0;
switch (GET_PIN(MODULE2_PORT_PIN))
{
case 1:
pinmask = 0x1;
break;
case 2:
pinmask = 0x2;
break;
case 3:
pinmask = 0x3;
break;
default:
break;
}
printf ("%#x", pinmask); /* prints "0x2" */
但我想将 pinmask 保留为 #defines。有没有办法实现一个#define GET_PINMASK 宏,它使用开关盒来定义引脚掩码?我的目标是:
#define MODULE1_PINMASK ASSIGN_PINMASK(GET_PIN(MODULE1_PORT_PIN))
在这种情况下,它将 MODULE1_PINMASK 定义为 0x1。
编辑:#define MODULE1_PORT_PIN A,1 中的第二个参数是 uint8_t 而不是十六进制值,所以我不能直接传递它。
【问题讨论】:
-
在
#define MODULE1_PORT_PIN A,1中,1(或其他任何东西)是否被解释为十六进制?所以如果有#define MODULE23_PORT_PIN A,23,那么应该有#define MODULE23_PINMASK 0x23。对吗? -
@internetAusie,该值实际上是一个uint8,所以我不能直接传递它。抱歉没有澄清,我已经编辑了我的帖子。
-
我不确定您是否知道以下事实: 1. 宏(有 () 和没有)只是宏预处理器中文本替换的主题。 2. 0x1 = 1, 0x2 = 2, ..., 0x9 = 9。无论在哪里接受小数,十六进制也是如此(反之亦然)。
-
@Scheff,1. 我知道宏只是一个文本替换,但我想我应该问一下,以防有什么方法可以实现它。 2. 我给出了这些十六进制值来简化问题。实际上,int 值表示 X 位的二进制移位。因此,例如在
#define MODULE2_PORT_PIN A,2中,我追求的十六进制值是 0x4 (0b1 -
另外,您的陈述“
*_PIN中的第二个参数是 uint8_t 而不是十六进制值”没有任何意义。您只显示了第二个参数,它们是小的、无后缀的十进制文字;这些在编译器中具有int类型(更准确地说是“翻译阶段 7”),并且在预处理器中根本没有类型(在预处理器进行算术的一个地方,它在intmax_t无论如何) .照原样,我看不出有什么问题,但如果第二个参数曾经是一个变量,那将立即意味着你想要的东西无法完成;会这样吗?
标签: c macros embedded c-preprocessor preprocessor