【问题标题】:Same function name, different C files相同的函数名,不同的 C 文件
【发布时间】:2021-08-17 13:45:35
【问题描述】:

我在 C 语言中有两个工具可以将数据库中的数据解析为 XML 文件或普通文本文件。这两个文件包含相同的函数名称但具有不同的实现,因此我正在努力将它们合并到一个工具中,并且输出类型(XML 或文本)将取决于用户的输入。

因此,问题在于具有相同的函数(和结构)名称但具有不同的实现。我怎样才能克服这种情况而不必重命名所有内容,因为这会导致混乱。

谢谢。

【问题讨论】:

  • with namespaces,这基本上就是他们发明的目的 - 编辑:没关系,那是 c++
  • 如果这些函数只在同一个翻译单元中本地调用,可以设为static。否则 - 仅重命名。
  • @StefanRiedel C 中没有命名空间。
  • 为什么要合并它们?将工具分开,并编写一个可以调用适当工具的包装器。 “集成不好,模块化好”
  • 将它们设为静态,并拥有一个结构体,其中包含从每个文件中导出的函数指针。

标签: c


【解决方案1】:

如果您必须在同一程序中同时使用两组类型和函数,并且这些类型和函数名称必须在其封闭源文件之外可见1 (即,您有一个带有这些类型定义和函数声明的 .h 文件),然后您必须重命名其中的至少一组。没有其他选择。 C 不提供用户可定义命名空间2,因此任何具有外部链接的东西必须具有全局唯一名称。

如果这些类型和函数名称​​不必必须在其源文件之外可见3(即,它们不必由函数调用在源文件之外定义),那么您可以将函数声明为 static - 这将限制它们对封闭源文件的可见性。如果类型名称是源文件的本地名称(您没有将它们放在必须包含在另一个源文件中的 .h 中),那么它们将不会被导出。

如果您只需要使用一组或另一组,但直到运行时才知道哪一组,您可以将每个组放入共享库中,然后在运行时加载正确的一组(在 *nix 上使用 dlopen侧面 - 不确定 Windows 等效项是什么)。

第四个选项是切换到 C++ 并将每个集合包装在一个唯一的命名空间中;取决于你在做什么,这可能是最快的选择。


  1. 函数名称具有所谓的外部链接
  2. C 有四个命名空间——标签名、标签名、structunion 成员名,以及所有其他标识符(变量名、函数名、typedef 名、枚举常量等。 )。这些命名空间是固定的,你不能再创建了。
  3. 函数名称有内部 或没有链接。

【讨论】:

    【解决方案2】:

    您可以将每个函数定义包含在不同的命名空间中。您不必更改命名空间内函数调用,但必须在命名空间间函数调用前加上“其他”命名空间。

    【讨论】:

    • C 中没有命名空间
    • @EugeneSh.:这会让 C 2018 6.2.3 1 的作者感到惊讶:“……因此有单独的 命名空间……”跨度>
    • @EricPostpischil 你明白我的意思。
    • @EugeneSh.:我做到了,但学生不会从不正确的单词中学习。为了知道这样一个句子的正确含义,您必须已经知道该句子的正确含义。很简单,正确地说,C 没有用于函数名称的单独名称空间。
    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多