冲突类型总是C中的问题吗?

时间:2009-02-26 01:20:24

标签: c namespaces

我越来越痛苦地从Java转移到C.我已经习惯了使用不同的方法来使用相同的名称,但它们采用不同的参数。在C中这会产生问题吗?

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

Cell makeCell(Cell parent);

对于这个问题,是否有一些快速的解决方法,或者我应该保持一个僵硬的上唇并打电话给其中一个_makeCellmakeCell2或同样荒谬的东西?

8 个答案:

答案 0 :(得分:10)

在C中,你没有重载函数 - 具有相同名称但参数类型不同的函数(在C99中忽略诸如<tgmath.h>之类的esoterica)。

必须为这些函数指定不同的名称。

或者使用支持重载函数名称的其他语言。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

欢迎来到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);

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

答案 4 :(得分:2)

正如其他人提到的,无法创建两个具有相同名称的函数,您可以使用以下内容:

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);

创建一个新的空Cell,另一个设置需要设置的内容。当然,如果这是一个可行的选择,它取决于“细胞”的性质。

答案 5 :(得分:1)

C中没有函数重载,但是如果你想要或必须使用C,你可以通过创建一个带有可变数量参数的函数来实现类似的东西。您可以从这里开始获取有关各种技术的信息,其中一些技术相当便携:http://en.wikipedia.org/wiki/Stdarg.h

但是,一般情况下,我会谨慎地反对在C中过于广泛地使用这个技巧。使用变量参数函数的最常见原因是实现printf()之类的函数,而不是函数重载kludges。但如果你想要的话就在那里。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

/* 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个花车。