将结构用作c的缺点;名称空间;

将结构用作c的缺点;名称空间;,c,struct,namespaces,global-namespace,C,Struct,Namespaces,Global Namespace,例如,我经常将一组相关的全局函数和变量包装在一个结构中,为它们创建一种“名称空间” extern struct foo_namespace { int (* const foo)(int a); int (* const bar)(void); const int a; const int b; int x; int y; } foo; 然后将其与设置函数和常数的.c文件链接 这使我可以创建全局名称,而不用担心名称空间中有什么以及以后会有什么,它

例如,我经常将一组相关的全局函数和变量包装在一个结构中,为它们创建一种“名称空间”

extern struct foo_namespace {
    int (* const foo)(int a);
    int (* const bar)(void);
    const int a;
    const int b;
    int x;
    int y;
} foo;
然后将其与设置函数和常数的
.c
文件链接

这使我可以创建全局名称,而不用担心名称空间中有什么以及以后会有什么,它非常干净和方便

不过,我确实担心,它会要求通过指针调用函数,从而在我的代码中引入少量低效,而且可能还有其他问题

以这种方式分组全局文件有哪些潜在的问题和低效,无论是程序设计、速度、可执行文件大小还是其他方面的问题

编辑:
我只是运行了一个循环,在结构中有一个空函数,还有一个常规函数。当没有应用优化时,结构中的函数更快(20秒对26秒)。优化后,全局函数完全优化,速度更快。除非函数可以内联,否则就速度而言,这似乎不是什么大问题。

由于结构对齐,分配了更多内存(更多信息)。结构实例将与其最宽的标量成员对齐

将结构用作c“命名空间”的缺点

增加碰撞的可能性

这里的想法是使用
foo.a
foo.x
foo.bar()
与可能的
foo.a
foo.x
foo.bar()
。现在的问题是
foo
与任何其他3个字符
foo
对象/函数冲突


前缀
foo_
方法需要5个以上字符的匹配来进行碰撞,虽然OP的思想确实组织了对象和函数,但是它增加了碰撞的机会。

为什么你不在C++中编程?尝试将C变成伪工具的目的是什么?只需按照流程编写惯用代码即可。处理出现的名称冲突问题。“他们几乎从来没有这样做过。”@PeterJ个人认为,我只是喜欢在我的程序中有更多的控制和透明度,而且通常c会创建更小的可执行文件。然而,c/c++的争论以前已经发生过很多次了,我不知道在这里讨论有多重要一些开销是不可避免的,因为代码必须在每次运行时解析一个引用。但是考虑到你的观点,我建议使用预处理器来减少编译时的开销,避免运行时的性能损失。例如,定义一个宏
#define ns(名称空间,对象)名称空间#####对象
将在对象名称前面加上名称空间和下划线,而在运行时不需要做任何工作。@JohnBollinger这种方法会使这些事情更加困难吗?如果是这样,您可以详细说明吗?详细信息:“对其最宽的标量成员进行对齐。”-->这不是成员的宽度,而是成员的对齐需求。该链接支持将您的观点作为一种概括,而不是一种要求。