c - 定义一个函数,函数名被宏屏蔽

标签 c gcc macros masking

有时候,用一个同名的宏来屏蔽一个函数会很方便。 在这个人为设计的示例中,宏可以在调用 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/

相关文章:

variables - 如何在 TWIG 宏中访问模板变量?

c# - 在 C# 中编码 C 结构

c - 检查字符串的标记方法

c++ - 尝试使用Windows Midi API时出现gcc错误

c - 使用 GCC 强制从链接的静态库中导出特定的可见符号(同时排除其他符号)

c - 使用 ## 运算符扩展宏

gcc可以编译graphics.h还是只能用borlan Turbo C编译器编译graphic.h

c - 总线错误排查

c++ - Debug exec 工作正常但正常的一个段错误

macros - 在 scheme 中定义 goto