【发布时间】:2013-08-06 10:24:03
【问题描述】:
假设我在 C 中有一个名为 FOO 的函数宏。还有两个宏称为BAR1 和BAR2,它们基本上是同一个宏的两种风格。我想编写一个宏BAR,使其在函数中扩展为BAR1,在使用BAR 之前调用FOO,否则扩展为BAR2。比如:
void func1(void)
{
FOO();
...
BAR();
}
相当于
void func1(void)
{
FOO();
...
BAR1();
}
这个函数:
void func2(void)
{
BAR();
}
相当于
void func2(void)
{
BAR2();
}
我想避免在运行时引入全局变量或进行额外检查。这甚至可能吗?
【问题讨论】:
-
如果
BAR1和BAR2可以是绝对任意的宏,则不能,因为您不能动态地调整#define的宏扩展。但是,如果您告诉我们BAR1和BAR2本质上是什么,那么可能有一种方法可以利用结构上的相似性来做到这一点。 -
你准备好提交 IOCCC 了吗?
-
@nneonneo:
FOO()检查指针是否为 NULL。BAR1()取消引用该指针,而BAR2()没有。 -
@user2656304:我实际上相信编译器会对其进行优化。
NULL检查非常便宜,大多数编译器可以在启用优化的情况下跳过多余的NULL检查。 -
@user2656304:不优雅?奇怪的词,因为你愿意以这种方式滥用预编译器。