我开始在GTK +上做一些小项目。
GLib定义了一系列数据类型,例如gint
gpointer
等等,它们只是typedef
个基本数据类型(gint
是{type}的{ {1}},int
gpointer
等等。
现在,假设我有一个函数或类,它决不会使用GTK。我真的很想使用基本数据类型,以便我可以在其他地方重用类/函数,即使我不包含GTK标题。
另一方面,我觉得在代码中混合使用void*
和gint
非常难看,因为它们实际上是相同的。
总之,我想知道是否有一个标准的做法,即何时使用其中一个,或者是否应该随意混合它们......
答案 0 :(得分:0)
我在第三方库中处理这个问题很多,他们都想要整数,浮点数,长整数,短路,字节别名而不是字符等的类型别名。
这很烦人。这通常是为了确保可移植性,但最终会为每个库提供自己的标准。
我觉得最令人不快的是从耦合的角度来看。我可能有一个通用的网格界面,它应该与任何渲染问题分离。然而,它的一些数据可能会直接传递给OpenGL函数,该函数想要假设我们传递的整数大小匹配sizeof(GLint)
。
在某些情况下,这不仅仅是审美。在这个网格头中包含GL头可能不太合理,因为它可能是广泛使用的软件开发工具包的一部分,它不应该对使用它的第三方插件编写者有这样的编译时依赖性。
然而可移植性是一个问题。我设法在一个非常大规模的遗留C代码库中度过了一个噩梦般的场景,其中隐含的假设是在sizeof(int) == sizeof(void*)
的整个代码库中做出的。在干草堆中寻找针头需要多年才能将此代码库移植到64位。
我个人已经确定的是多年来开始偏爱普通的旧的非混淆数据类型。我也喜欢使用有符号整数,例如我发现在过去甚至避免在通过容器的基本循环中发出警告,其中一些人会使用int
,其他人使用unsigned int
,其他size_t
等来表示包含的元素数量。 。至少在个人方面,我发现我的维护时间只是偏向int
而没有充分的理由不这样做。
尝试在sizeof(int) != sizeof(GLint)
的某个平台上缓解潜在的最坏情况,例如,我倾向于在代码周围散布断言,假设这两者是相等的:assert(sizeof(int) == sizeof(GLint));
。这应该可以显着减轻与我从32位移植到64位之前遇到的那种噩梦场景相关的痛苦。它还明确表达了这些假设。
我发现这可以为我的案子建立一个舒适的平衡。当然这都是主观的,根据您的使用情况可能会有很大差异。但这是一种可能的解决方案,可能允许您在不考虑所有这些第三方库的情况下越来越多地支持普通的旧的非混淆数据类型,如果您的假设在某些平台上不再正确,则不会面临最坏情况。