5

可以像这样在 C 中模仿命名空间:

#include <stdio.h>
#include <math.h>

struct math_namespace {
    double (*sin)(double);
};
const struct math_namespace math = {sin};

int main() {    
    printf("%f\n", math.sin(3));

    return 0;
}

这有什么缺点,或者只是前缀更有意义的情况?这样做似乎更干净。

4

4 回答 4

3

此方法已在实际项目中使用,例如 Jacob Navia 的C Containers Library。C 不是为面向对象编程而设计的。这不是很有效,因为您必须 (1) 访问结构和 (2) 取消引用函数指针。如果你真的想要前缀,我认为改变你的标识符仍然是最好的解决方案。

于 2013-02-26T17:12:34.600 回答
1

我已经使用这种风格有一段时间了。它有助于组织程序,而没有 OOP 语言的所有多余包袱。没有性能损失,因为在 C 中访问函数指针与直接访问函数相同。我非常喜欢它,甚至写了一篇很短的论文。它可以在http://slkpg.1eko.com在页面底部的“C with Structs”链接下找到。直接链接是http://slkpg.1eko.com/cstructs.html

于 2014-11-01T20:05:53.997 回答
0

为什么要重新发明轮子?一个缺点是所有设置都可能不同步,并且要添加到名称空间中,您必须更改结构。

而且没有“使用命名空间”,所以你总是必须指定它。不同参数类型的函数又如何呢?

于 2013-02-26T17:04:54.397 回答
0

好吧,这确实允许您导出命名空间,并且它确实允许客户端模块使用名为sin. 所以,从这个意义上说,它确实有效。

缺点是它对 ELF 不太友好。struct初始化埋在可写数据页的中间,需要修补。除非您是静态链接,否则这是加载时修复。从好的方面来说,它只是复制了 ELF 调度表所做的事情,所以我敢打赌它甚至不会更慢。在 Windows 上,我认为考虑因素是相似的。

于 2013-02-26T17:11:17.080 回答