有没有一种更干净/更简单的方法来做到这一点?
下面的方法工作正常,但我认为它很难看--我想要一个解决方案,它不需要为作为“端口”传递的每个可能的无效值单独定义。
#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)如果"port“不是B,我需要一个null语句。
我想摆脱所有的#定义,而不是做某事的定义。
我想这样做,因为在这个单片机上,除B之外的所有端口都是数字的,没有什么可做的。
但是,调用ConfigDigitalBits()对于任何端口来说都应该是有效的。
发布于 2015-08-15 15:34:41
你可以做这样的事
#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。您可以对此进行assert,但这只会在运行时捕获错误。
一旦达到这个目的,考虑从整体上去掉宏,而使用一个inline函数,这也将允许常量传播。
inline void
config_digital_bits(const char port, const unsigned mask)
{
assert(port >= 'A' && port <= 'K');
if (port == 'B')
AD1PCFGSET = mask;
}https://stackoverflow.com/questions/32020812
复制相似问题