gpt4 book ai didi

C 宏 : Conditional code based on parameter value?

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:48 26 4
gpt4 key购买 nike

有没有更干净/更简单的方法来做到这一点?

下面的工作正常,但我认为它很难看 - 我想要一个解决方案,不需要为每个可能的无效值作为“端口”传递一个单独的#define。

#define _port_A_config_digital(mask)        // do nothing; this port is always digital
#define _port_B_config_digital(mask) AD1PCFGSET = (mask)
#define _port_C_config_digital(mask)
#define _port_D_config_digital(mask)
#define _port_E_config_digital(mask)
#define _port_F_config_digital(mask)
#define _port_G_config_digital(mask)
#define _port_H_config_digital(mask)
#define _port_I_config_digital(mask)
#define _port_J_config_digital(mask)
#define _port_K_config_digital(mask)

#define ConfigDigitalBits(port, mask) _port_##port##_config_digital(mask)

如果“端口”是 B 以外的任何,我想要一个空语句。

除了做某事的#defines 之外,我想摆脱所有#defines。

我想这样做是因为在这个 MCU 上,除 B 之外的所有端口都是总是数字的,没有什么可做的。

但是调用 ConfigDigitalBits() 对任何端口来说应该是一件有效的事情。

最佳答案

你可以做类似的事情

#define CONFIG_DIGITAL_BITS(PORT, MASK) \
do { if (PORT == 'B') AD1PCFGSET = (MASK); } while (0)

并相信(或通过读取程序集进行检查)您的编译器会在编译时评估 if 条件。也就是说,

CONFIG_DIGITAL_BITS('B', 0x42);

只会为

生成代码
AD1PCFGSET = 0x42;

CONFIG_DIGITAL_BITS('A', 0x42);

根本不会生成任何代码。

上面建议的代码存在忽略错误的问题。例如,

CONFIG_DIGITAL_BITS('Z', 0x42);

虽然没有端口 Z,但会很高兴地编译。您可以对此断言,但这只会在运行时捕获错误。

一旦你做到这一点,考虑完全摆脱宏并使用 inline 函数代替,这也将允许持续传播。

inline void
config_digital_bits(const char port, const unsigned mask)
{
assert(port >= 'A' && port <= 'K');
if (port == 'B')
AD1PCFGSET = mask;
}

关于C 宏 : Conditional code based on parameter value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020812/

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