首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C预处理器中的参数校验

C预处理器中的参数校验
EN

Stack Overflow用户
提问于 2015-08-14 23:52:20
回答 2查看 1K关注 0票数 2

如何在编译时测试哪个标识符作为C中的宏参数的值传递?

我正在用C (GNU)为微控制器编写包装宏。

我有一些宏是这样工作的:

代码语言:javascript
运行
复制
#define _ReadBits(port, mask)      (PORT ## port) & (mask)
#define ReadBits(portmask)         _ReadBits(portmask) 
#define SWITCH D, (1<<7)

这样我就可以说:

代码语言:javascript
运行
复制
foo = ReadBits(SWITCH);

我会得到

代码语言:javascript
运行
复制
foo = PORTD & (1<<7);

效果很好。我想把这些扩展到这样的事情:

代码语言:javascript
运行
复制
#define _ConfigAnalog(port, mask)  BUILD_BUG_ON(port != B); AD1PCFGCLR = (mask)
#define ConfigAnalog(portmask)    _ConfigAnalog(portmask)

也就是说,如果参数port不是B,我希望出现编译时错误(因为这个微控制器只能将端口B配置为模拟)。

C中有什么方法可以这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-15 00:14:02

我自己想出来的:

代码语言:javascript
运行
复制
#define PORT_B_SUPPORTS_ANALOG

#define __CheckPort(p)  PORT_##p##_SUPPORTS_ANALOG
#define __ConfigAnalogBits(mask) AD1PCFGCLR = (mask)

#define _ConfigAnalogBits(port, mask)  __CheckPort(port); __ConfigAnalogBits(mask)
#define ConfigAnalogBits(portmask)     _ConfigAnalogBits(portmask)

#define NO_GOOD C, (1<<3)
#define VOLTAGE B, (1<<3)

void tryit(void)
{
    ConfigAnalogBits(VOLTAGE);
    //ConfigAnalogBits(NO_GOOD);
}

如果"port“是B,那么_CheckPort编译成null语句。

如果“端口”是其他任何东西,则会发生构建错误。

票数 4
EN

Stack Overflow用户

发布于 2015-08-15 00:01:39

如何在编译时测试C中宏参数的字符串值?

你不能这么做。

根据C99 6.10.1条件包含,预处理条件必须是整数常量表达式,并且可以测试宏是否已定义(使用#if#ifdef identifier#if defined(identifier))。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32020161

复制
相关文章

相似问题

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