首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C宏:基于参数值的条件代码?

C宏:基于参数值的条件代码?
EN

Stack Overflow用户
提问于 2015-08-15 02:07:47
回答 1查看 667关注 0票数 1

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

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

代码语言:javascript
复制
#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()对于任何端口来说都应该是有效的。

EN

回答 1

Stack Overflow用户

发布于 2015-08-15 15:34:41

你可以做这样的事

代码语言:javascript
复制
#define CONFIG_DIGITAL_BITS(PORT, MASK) \
  do { if (PORT == 'B') AD1PCFGSET = (MASK); } while (0)

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

代码语言:javascript
复制
CONFIG_DIGITAL_BITS('B', 0x42);

只会为

代码语言:javascript
复制
AD1PCFGSET = 0x42;

代码语言:javascript
复制
CONFIG_DIGITAL_BITS('A', 0x42);

根本不会产生任何代码。

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

代码语言:javascript
复制
CONFIG_DIGITAL_BITS('Z', 0x42);

很乐意编译,尽管没有端口Z。您可以对此进行assert,但这只会在运行时捕获错误。

一旦达到这个目的,考虑从整体上去掉宏,而使用一个inline函数,这也将允许常量传播。

代码语言:javascript
复制
inline void
config_digital_bits(const char port, const unsigned mask)
{
  assert(port >= 'A' && port <= 'K');
  if (port == 'B')
    AD1PCFGSET = mask;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32020812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档