【发布时间】:2019-01-19 02:11:47
【问题描述】:
有时,用同名的宏来屏蔽函数会很方便。
在这个人为的示例中,宏可以在调用 function() 时插入额外的验证。
int function(int i);
#define function(i) ( assert(i>0), function(i) )
其他更常见的用法使宏转换为更快的代码,例如直接表入口点,以提高性能。
在所有情况下,目标都是在库中保留同名符号,以确保它存在并且可以由另一个程序从库中调用,而不需要 *.h(通常来自与 @987654324 不同的语言的包装器@)。
在相应的单元中,定义function() 现在有一个问题:function 现在是一个宏。所以int function(int i) { ... } 将被扩展,并且非常失败。
解决这个问题的方法很简单:在定义前#undef function,然后实现函数。
一切都很好,除了...
如果在同一单元的后面部分中,另一个函数调用function(),它现在将直接调用符号,而不是*.h 中的宏,从而失去宏提供的额外功能,这可能是不可取的。
在gcc 中提供了另一个解决此问题的方法,使用编译器扩展#pragma push_macro。
它可以工作,但非常难看,在函数定义周围添加了至少 3 行,这对可读性没有帮助。这还不包括可移植性的恶作剧,这会增加更多的复杂性。
然而,用同名宏屏蔽函数并不是什么新鲜事。我很确定我早在 C90 标准库中就已经阅读过建议这种设计的书籍。
我怀疑这个问题可能存在更好的解决方案。 有什么想法吗?
【问题讨论】: