C语言中带结构的名称空间
可以在C中模拟名称空间,如下所示:C语言中带结构的名称空间,c,namespaces,C,Namespaces,可以在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; } #包括 #包括 结构数学名称空间{
#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;
}
#包括
#包括
结构数学名称空间{
双(*sin)(双);
};
const struct math_namespace math={sin};
int main(){
printf(“%f\n”,math.sin(3));
返回0;
}
这有什么缺点吗,或者只是在前缀更有意义的情况下?这样做似乎更干净。为什么要重新发明轮子?一个缺点是所有的设置都可能不同步,而且要添加到名称空间中,必须更改结构 而且没有“使用名称空间”,所以您必须始终指定它。使用不同参数类型的函数如何?好的,这允许您导出名称空间,并且允许客户端模块使用名为
sin
的静态或本地版本。所以,从这个意义上说,它确实有效
缺点是它对精灵不太友好。结构初始化被隐藏在可写数据页的中间,需要修补。除非是静态链接,否则这是加载时修复。好的一面是,它只是复制了ELF调度表的功能,所以我打赌它不会再慢了。在Windows上,我认为考虑因素是类似的。这种方法已经在实际项目中使用,例如Jacob Navia的。C不是为面向对象编程而设计的。这并不是很有效,因为您必须(1)访问结构和(2)取消对函数指针的引用。如果您真的需要前缀,我认为更改标识符仍然是最好的解决方案。我使用这种样式已有一段时间了。它有助于组织程序,而不必承担OOP语言的所有过重负担。没有性能损失,因为在C中访问函数指针与直接访问函数是相同的。我非常喜欢它,甚至为此写了一篇很短的论文。可以在页面底部的“C with Structs”链接下找到它。
直接链接是。
sin
具有类型双sin(double)
,您应该更改类型或使用sinf
。有趣的方法。但我认为它和前缀一样对可读性有害。我看到的主要缺点是,如果函数指针没有初始化,就会出现运行时错误,而不是链接错误?(带时间惩罚?)不同参数类型的函数如何?你重新发明轮子是什么意思?因为项目需求,使用C++不是一个选项。@如果你写C代码是有原因的,那就这么做吧。不要再发明另一个language@BoPersson我正在为我自己的语言编写一个编译器,它可以轻松地与C代码交互。C++具有复杂性和缺乏ABI兼容性的缺点。