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