假设我在 C 中有一个名为 FOO
的函数宏。还有两个宏称为 BAR1
和 BAR2
,它们基本上是同一个宏的两种风格。我想编写一个宏 BAR
以便它在使用 BAR 之前在某处调用
和 FOO
的函数中扩展为 BAR1
BAR2
否则。例如:
void func1(void)
{
FOO();
...
BAR();
}
相当于
void func1(void)
{
FOO();
...
BAR1();
}
虽然这个函数:
void func2(void)
{
BAR();
}
相当于
void func2(void)
{
BAR2();
}
我想避免在运行时引入全局变量或进行额外的检查。这可能吗?
最佳答案
简短的回答:不。 C 预编译器对函数限制一无所知,因此即使您根据需要设法修改了 BAR
宏,无论如何也不会限于当前函数。
现在,如果您愿意,可以向 BAR
宏添加一些检查。并且可以编写这些检查以在编译时解决,因此不会产生运行时开销。
例如:
extern char _sentinel_[2];
#define FOO() char _sentinel_;
#define BAR() if (sizeof(_sentinel_) == 1) BAR1() else BAR2()
诀窍是查找变量_sentinel_
将解析全局变量或局部变量,这取决于FOO()
的使用。由于 if
中的条件是一个编译器常量,编译器将优化其他分支。
关于c - C宏的乐趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18077504/