C语言是否有类似于C++的命名空间?

3

来自Michael Scott的编程语言实践

C和C++的现代版本包括命名空间机制,提供了类似模块化的数据隐藏

C是否有类似于C++的命名空间?

“标识符名称空间”在C in a Nutshell中提到,这些是否与Scott的书中提到的“名称空间”类似,并且类似于C++中的名称空间?谢谢。

10
C语言没有类似于C++的命名空间机制。 - zerkms
@zerkms 那应该是一个答案,我非常确定 - David Z
我相信这指的是标识符之间的关联。 - Antti Haapala -- Слава Україні
2个回答

7
不可以,C语言没有命名空间(namespace)机制来提供“模块化数据隐藏”。关于你引用的书,我对其一无所知,但是“namespaces”这个词有很多不同的含义,就像“window”,被重载了。这让我对作者在一个历史悠久、普及广泛的计算机语言上如此明显地犯错产生质疑。

在C语言中,“命名空间”是一个完全不同的机制,用于完全不同的目的。这些是“C in a Nutshell”中讨论过的命名空间。这些单词的意思与C++的命名空间不同。由于David Rankin查阅了C11标准章节的参考,这些是C中使用的命名空间:

  • 标签名(label names)
  • 结构体/联合体/枚举类型(struct/union/enum tags)
  • 结构体/联合体成员(struct/union members)
  • 其他所有内容(包括枚举值)(everything else)

作用域的简要说明
请记住,这并不涉及作用域,这是一个单独的机制。例如,全局变量和函数内部的变量可能具有相同的名称;但是它们共享相同的命名空间。不同之处在于局部变量遮蔽了全局变量的可见性。

C++中命名空间的价值
目前尚不清楚命名空间是否是C ++非常有用的扩展,其正义性的争论仍在继续。C语言的人(大多数)认为,增加命名空间会导致许多问题,这并不值得。我无法在互联网上找到任何特别有用的信息,除了一些关于使用结构体模拟它们或(更糟糕的是)使用宏滥用的单调文章。如果你真的想深入研究,可以在comp.lang.c新闻组的存档中找到一些有用的讨论。


1
不,C语言没有类似于C++命名空间的东西。大多数人只能使用下划线表示法来模拟C++的功能。至少我是这样做的,而不是试图将所有内容打包到结构体中。您的IDE仍然可以帮助您进行代码辅助,您只需要习惯使用下划线而不是点来表示所有内容。
MyNamespace::MyObject.myMethodOrVar ...

最终在C中看起来就像这样。
MyNamespace_MyObject_myMethodOrVar

可能没有C ++或Java那么流畅,但它可以工作,并仍然有助于避免名称冲突。这只是一个痛苦的问题。 是的,这不会给你像use这样的句法设备。恐怕就是这样了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接