【问题标题】:Namespacing libraries in CC 中的命名空间库
【发布时间】:2020-02-04 05:09:59
【问题描述】:

所以我尝试使用 C 而不是 C++,但我遇到了一个问题,大多数库的名称都很琐碎,无论它是一个函数还是其他什么。例如 "Berkley Socket library" 有函数 write(),这是一个非常琐碎的名字,我认为不应该使用,有什么方法可以不污染我的整个代码吗?我可以在某种命名空间中隔离包含的文件吗?

【问题讨论】:

  • 我同意这是 C 语言中的一个问题。但是,如果您只包含您实际需要的头文件,根据我的经验,这不是什么大问题。例如,除了在实际使用 Berkeley 套接字的 C 源代码文件中之外,不要包含 。恐怕这是我能给出的唯一建议。也许其他人可以提供进一步的建议。我希望 C 有时会添加对命名空间的支持。
  • This Stack Overflow question 是相关的,您可能会在那里找到一些答案。
  • 另外,this Stack Overflow question 讨论了 C 库中的名称冲突问题。似乎对于 C 库,库的主要职责是确保不会发生名称冲突,例如通过为所有名称添加公共前缀。

标签: c


【解决方案1】:

一般情况

不,除非你想对目标文件进行黑客攻击。

如果使用该函数,则必须在源代码中为其名称定义一个宏(例如#define write namespace1_write),然后必须使用objcopy 为对象中的所有符号添加前缀,例如所以:

objcopy --prefix-symbols=namespace1_ infile.o outfile.o

如果您随后链接到该对象,则可以使用该功能。 This answer 非常深入地介绍了如何做到这一点。我建议阅读它。

根据您的情况

可能,如果您的应用程序中不需要 POSIX 函数。

如果你不使用函数write 并且你不包含声明它的头文件,你就不必弄乱目标文件。 ELF 格式(现在在 Unix 中常用)指定主可执行文件中的符号覆盖任何加载的共享共享库中的符号。

但是,POSIX 不保证这一点。您必须在严格符合 ISO C 模式下编译才能应用。

【讨论】:

  • 是的,我认为这是一个很好的答案,但如果它是像sys/socket.h这样的共享库,则不然
  • @ishidex2 这只是一个头文件。它不是共享库。
  • 没关系,因为我不能在不破坏操作系统的情况下修改标题。
  • @ishidex2 好吧,在那种情况下,那就干脆不包含头文件。 ELF 标准规定程序本身中的函数write 将覆盖标准C 库中的函数write
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2010-09-28
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多