如何在编译时测试哪个标识符作为C中的宏参数的值传递?
我正在用C (GNU)为微控制器编写包装宏。
我有一些宏是这样工作的:
#define _ReadBits(port, mask) (PORT ## port) & (mask)
#define ReadBits(portmask) _ReadBits(portmask)
#define SWITCH D, (1<<7)这样我就可以说:
foo = ReadBits(SWITCH);我会得到
foo = PORTD & (1<<7);效果很好。我想把这些扩展到这样的事情:
#define _ConfigAnalog(port, mask) BUILD_BUG_ON(port != B); AD1PCFGCLR = (mask)
#define ConfigAnalog(portmask) _ConfigAnalog(portmask)也就是说,如果参数port不是B,我希望出现编译时错误(因为这个微控制器只能将端口B配置为模拟)。
在C中有什么方法可以这样做吗?
发布于 2015-08-15 00:14:02
我自己想出来的:
#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语句。
如果“端口”是其他任何东西,则会发生构建错误。
发布于 2015-08-15 00:01:39
如何在编译时测试C中宏参数的字符串值?
你不能这么做。
根据C99 6.10.1条件包含,预处理条件必须是整数常量表达式,并且可以测试宏是否已定义(使用#if、#ifdef identifier或#if defined(identifier))。
https://stackoverflow.com/questions/32020161
复制相似问题