【问题标题】:Are conflicting types always a problem in C?冲突类型在 C 中是否总是一个问题?
【发布时间】:2009-02-26 01:20:23
【问题描述】:

我在从 Java 迁移到 C 时遇到了成长的烦恼。我已经习惯了使用不同的方法,名称相同,但参数不同。在 C 中这会产生问题吗?

Cell makeCell(int dim, int iterations, Cell parent);

Cell makeCell(Cell parent);

对于这个问题是否有一些快速的小工作,或者我应该保持僵硬的上唇并称其中一个为_makeCellmakeCell2或同样荒谬的东西?

【问题讨论】:

  • 您是在询问标签中的 C#,还是标题和问题中的 C?请澄清!
  • C#允许重载,所以他的意思一定是C。
  • 为什么要从 Java 切换到 C?这就像用一辆(快速但危险的)摩托车交换你漂亮舒适的丰田汽车。你至少不能使用C++吗?它允许重载函数。而且,与 C 不同,它在标签(命名空间)中包含您所指的内容。
  • @dehmann - 为什么 C 讨厌?如果他愿意,他可以学习 C。

标签: c namespaces


【解决方案1】:

在 C 中,您没有重载函数 - 具有相同名称但参数类型不同的函数(忽略 C99 中的 <tgmath.h> 等深奥)。

函数必须有不同的名称。

或者使用支持重载函数名的不同语言。

【讨论】:

    【解决方案2】:

    正如您在 Java 或 C++ 中所理解的那样,C 中没有重载(尽管使用函数指针手动创建了重载,但如果您想要面向对象,请使用 C++,而不是 C 与 kludges :-),所以您应该你怀疑,称它们为不同的函数名称。

    但不要称它们为 _makeCell 或 makeCell2,因为这不是描述性的。怎么样:

    Cell makeCellFromDimensionAndIteration(int dim, int iterations, Cell parent);
    Cell makeCell(Cell parent);
    

    第一个可以缩短,但要确保它仍然有意义。 makeCell2 对于阅读代码的人来说意义不大(包括六个月后的你自己)。

    【讨论】:

      【解决方案3】:

      简单地说,C 中没有方法重载,我认为可以创建预处理器规则来根据参数的数量重命名方法,但我不知道该怎么做,它会给你比简单地使用不同的名称要多得多。

      【讨论】:

      • 这正是 C++ 的由来。最初的实现是一个名为 cfront 的预处理器,它将早期的方言翻译成有效的 C,然后用普通的 C 工具链编译。如果您有病态的好奇,Google 会引导您找到 cfront 的源工具包。
      【解决方案4】:

      欢迎来到 C 地狱。有一个大的平面命名空间,没有重载,因此您需要约定来帮助您发明和管理名称。寻找灵感的好地方是 Dave Hanson 的C Interfaces and Implementations

      对于您的特定示例,我会建议以下内容:

      Cell_T Cell_with_dim(int dim, int iterations, Cell_T parent);
      
      Cell_T Cell_of_parent(Cell_T parent);
      

      (对这些建议不是很有信心,因为我很难猜测不同的重载应该做什么。)

      【讨论】:

        【解决方案5】:

        正如其他人所说,没有办法创建两个同名的函数,您可以使用类似的东西:

        Cell makeCell(Cell parent, int dim, int iterations);
        

        对于这两种情况并传递一些“特殊值”来区分这两种情况。例如:

        cell = makeCell(par,-1,-1);
        

        我看到的另一个选项是使用可变数量的参数:

        Cell makeCell(Cell parent, ...);
        

        但是你有一个问题是确定传递了多少参数,如果你不能通过查看“父级”来做到这一点,那么你基本上回到了前一种情况,因为你必须使用一个“特殊值”指定有多少个参数。

        如果这是一种构造函数(顾名思义),我宁愿有两个函数:

        Cell makeCell(Cell parent);
        Cell setCell(Cell cell, int dim, int iterations);
        

        一个创建新的空单元格,另一个设置需要设置的内容。当然,这取决于“细胞”的性质是否适合您。

        【讨论】:

          【解决方案6】:

          C 中没有函数重载,但如果您想要或必须使用 C,您可以通过创建一个接受可变数量参数的函数来实现类似的目的。您可以从这里开始了解各种技术的信息,其中一些相当可移植:http://en.wikipedia.org/wiki/Stdarg.h

          不过,一般来说,我会告诫不要在 C 中过于广泛地使用这个技巧。使用可变参数函数的最常见原因是为了实现像 printf() 这样的函数,而不是为了函数重载kludges。但如果你想要它,它就在那里。

          【讨论】:

            【解决方案7】:

            如果您来自 Java,您可能会发现 C++ 比 C 更容易掌握。而且由于您使用的编译器几乎肯定是 C++ 编译器,为什么不尝试一下?

            【讨论】:

              【解决方案8】:

              这是一个常见问题,因为您不能在 C 中重载函数。只有 the compiler can(如在 tgmath.h 中)。看看 GCC 的 tgmath.h 已经为我今天的 hack-o-meter 服务了。他们找到了我认为正确的词

              /* This is ugly but unless gcc gets appropriate builtins we have to do
               something like this. Don't ask how it works. */
              

              人们发明了不同的方法来解决它。例如,OpenGL 参加了一门课程,其中包括参数类型并计入函数名称:

              glVertex3f
              

              说函数需要 3 个浮点数。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多