介绍
大家好,我最近学习了 C 语言编程! (这对我来说是一个巨大的进步,因为 C++ 是第一门语言,我接触并吓跑了将近 10 年。)来自主要面向对象的背景(Java + C#),这是一个非常好的范式转变。
我喜欢 C。它是一种如此美丽的语言。最让我吃惊的是,C 支持的高度模块化和代码可重用性——当然它没有 OO 语言那么高,但仍然远远超出我对命令式语言的期望。
问题
如何防止客户端代码和我的 C 库代码之间的命名冲突?在 Java 中有包,在 C# 中有命名空间。想象一下我写了一个 C 库,它提供了“添加”操作。客户端很可能已经在使用这样的操作 - 我该怎么办?
我特别在寻找对客户友好的解决方案。例如,我根本不想为我的所有 api 操作添加前缀,如“myuniquelibname_add”。在 C 世界中对此有哪些常见的解决方案?您是否将所有 api 操作都放在一个结构中,以便客户端可以选择自己的前缀?
我非常期待通过您的回答获得更多见解!
编辑(修改后的问题)
尊敬的回答者,感谢您的回答!我现在明白了,前缀是安全避免命名冲突的唯一方法。所以,我想修改我的问题:我有什么可能性让客户选择他自己的前缀?
答案Unwind发布,是一种方式。它不使用通常意义上的前缀,但必须在每个 api 调用前加上“api->”前缀。还有哪些进一步的解决方案(例如使用#define)?
编辑 2(状态更新)
这一切都归结为以下两种方法之一:
- 使用结构
- 使用#define(注:方法有很多种,怎么用#define来实现,我想要什么)
我不会接受任何答案,因为我认为没有正确答案。选择哪种解决方案取决于具体情况和自己的喜好。我自己会尝试您提到的所有方法,以找出哪种方法最适合我在哪种情况下。欢迎在相应答案的评论中发表支持或反对某些方法的论据。
最后,我要特别感谢:
- Unwind - 因为他的复杂回答,包括“结构方法”的完整实现
- Christoph - 感谢他的好回答并指出我 Namespaces in C
- 所有其他人 - 感谢您的宝贵意见
如果有人认为关闭这个问题是合适的(因为没有进一步的见解可以期待),他/她应该随意这样做 - 我不能决定这个,因为我不是 C 大师。
最佳答案
我不是 C 大师,但从我使用的库来看,使用前缀来分隔函数是很常见的。
比如SDL会用SDL,OpenGL会用gl等...
关于C 库命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988728/