gpt4 book ai didi

我可以使用 C 中的宏来定义宏吗?

转载 作者:行者123 更新时间:2023-12-02 03:54:38 24 4
gpt4 key购买 nike

我有一组像这样的#define:

#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 */ 

我还需要更改引脚掩码:

#define MODULE1_PINMASK 0x1 /* then becomes #define MODULE1_PINMASK 0x4 */ 

我正在尝试通过不必手动更改引脚掩码来自动化该过程。到目前为止,我已经有了这些宏来提取 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" */

但我想将引脚掩码保留为#defines。有没有办法实现使用 switch case 来定义 pinmask 的 #define GET_PINMASK 宏?我的目标是:

#define MODULE1_PINMASK ASSIGN_PINMASK(GET_PIN(MODULE1_PORT_PIN))

在本例中将 MODULE1_PINMASK 定义为 0x1。

编辑:#define MODULE1_PORT_PIN A,1 中的第二个参数是 uint8_t 而不是十六进制值,因此我无法直接传递它。

最佳答案

我认为你可能想得太多了。如果每个 MODULEn_PORT_PIN 定义的第二个字段始终是 integer constant expression ,那么这应该可以工作:

#define MODULE1_PORT_PIN A,1
#define MODULE2_PORT_PIN A,2
#define MODULE3_PORT_PIN A,3

#define GET_SECOND(X, Y) (Y)
#define PIN_TO_MASK(PIN) (1ul << GET_SECOND(PIN))

#define MODULE1_PINMASK PIN_TO_MASK(MODULE1_PORT_PIN)
#define MODULE2_PINMASK PIN_TO_MASK(MODULE2_PORT_PIN)
#define MODULE3_PINMASK PIN_TO_MASK(MODULE3_PORT_PIN)

从您的问题中不清楚第二个字段是否可以是整数常量表达式之外的其他内容。如果第二个字段涉及 enum 常量,则 MODULEn_PINMASK 宏仍然可以在除 #if 表达式之外的任何上下文中使用。如果它涉及变量,那么它们只能在函数体内使用。 (因为这是 C 而不是 C++,所以即使变量是 const 也是如此。)

没有办法避免单独编写每个#define。如果这是一个问题,您应该考虑编写一个生成 #define 列表的程序。从 DSL 生成源代码在构建时,您自己的发明是一项被低估的技术。

关于我可以使用 C 中的宏来定义宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com