Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中带结构的名称空间_C_Namespaces - Fatal编程技术网

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; } #包括 #包括 结构数学名称空间{

可以在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;
}
#包括
#包括
结构数学名称空间{
双(*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兼容性的缺点。