我想要实现这样的事情:
#define MACRO(x) {PORTB=0,PORTC=0,PORTD=0}
MACRO(0); //This would get replaced by PORTB=0;
MACRO(1); //PORTC=0;
MACRO(2); //PORTD=0;
Run Code Online (Sandbox Code Playgroud)
我想创建一个"宏数组".我会传入一个索引,它会返回正确的代码.
这可能吗?
编辑:
如果有帮助,PORTB,PORTC和PORTD都是#defines.
它可以使用预处理器完成,但它可以说是丑陋的.
#define MACRO_CASE0 PORTB = 0
#define MACRO_CASE1 PORTC = 0
#define MACRO_CASE2 PORTD = 0
#define MACRO(X) MACRO_CASE##X
Run Code Online (Sandbox Code Playgroud)
另请参阅Boost.Preprocessor库.(它适用于C和C++.)
更新:在与Jonathan Leffler(见下文)讨论之后,我觉得有义务更新答案,劝告新C程序员不要滥用上面显示的(强大但肮脏)技术.
如果您 - 作为OP请求 - 想要传入索引并且它将返回正确的代码,那么您将需要求助于预处理器编程.但是,如果你想要做的是执行基于一些条件不同的代码,并希望这没有运行时开销,如果条件是一个编译时间常数,那么下面的方法不仅更加清洁也更灵活它也允许传递运行时值.
/* '#include' this definition in any file where you want to use it. */
static inline void
do_the_right_thing(const int selector)
{
switch (selector)
{
case 0:
PORTB = 0;
break;
case 1:
PORTC = 0;
break;
case 2:
PORTD = 0;
break;
default:
assert(!"cannot do the right thing: invalid selector");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在你的代码中,如果你写
do_the_right_thing(1); /* selector is a compile-time constant */
Run Code Online (Sandbox Code Playgroud)
与使用宏相比,启用适当优化的合适编译器不会产生任何开销.但是,你也可以写
do_the_right_thing(rand() % 3); /* selector is a run-time expression */
Run Code Online (Sandbox Code Playgroud)
并且编译器将插入一些快速切换代码以在运行时选择适当的操作.