有时候,用一个同名的宏来屏蔽一个函数会很方便。
在这个人为设计的示例中,宏可以在调用 function()
时插入额外的验证。
int function(int i);
#define function(i) ( assert(i>0), function(i) )
其他更常见的用法使宏转换为更快的代码,如直接表入口点,以提高性能。
在所有情况下,目标是在库中保留同名符号,以确保它存在并且可以由另一个程序从库中调用而无需 *.h
(通常来自包装器使用不同于 C
的语言)。
在相应的单元中,定义function()
现在有一个问题:function
现在是一个宏。所以 int function(int i) { ... }
将被扩展,并且会严重失败。
这个问题的解决方法很简单:只需在定义前#undef function
,然后实现函数即可。
一切都很好,除了...
如果在同一单元的后面部分,另一个函数调用 function()
,它现在将直接调用符号,而不是 *.h
中的宏code>,从而失去宏提供的额外功能,这可能是不希望的。
gcc
中提供了此问题的另一种解决方法,使用编译器扩展 #pragma push_macro
。
它有效,但非常丑陋,在函数定义周围至少添加了 3 行,这无助于提高可读性。这还不包括可移植性恶作剧,这会增加更多的复杂性。
然而,使用同名宏来屏蔽函数并不是什么新鲜事。我敢肯定,早在 C90 标准库时我就读过建议这种设计的书籍。
我怀疑可能存在解决此问题的更好方法。 有什么想法吗?
最佳答案
类函数宏的另一种技巧是在定义中的声明符周围放置多余的括号:
int (function)(int i) {
...
}
这阻止了类函数宏的匹配和扩展,但对定义没有影响。
关于c - 定义一个函数,函数名被宏屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54263537/