考虑这两个函数定义:
void foo() { }
void foo(void) { }
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?
我用C语言写了一个红黑树的实现。为了允许它使用变量类型,它只处理const void *元素,并且必须为树的初始化提供一个带有签名的比较函数int (*comp)(const void *, const void *)。到目前为止,一切顺利,但我现在尝试使用该 C 代码为 Python 构建扩展模块。乍一看,它看起来很简单,因为 Python 语言总是传递对对象的引用,这些对象由 C 例程作为指针接收。
Python 对象具有丰富的比较运算符。这意味着从 C 扩展模块中,比较 2 个任意对象是微不足道的:只需使用int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid).
但比较可能会返回 -1 以指示对象不可比较。在 Python 或 C++ 中,抛出异常来表示异常情况非常简单。不幸的是,C 没有异常的概念,我找不到使用setjmp-的方法longjmp,因为:
longjmp当内部函数不知道已分配什么时,我应该及时释放所有分配的内存一个简单的解决方案是为比较函数提供第三个参数,以便它发出异常情况信号。但是,当在纯 C 环境中使用该库时,第三个参数就没有意义。然后我想起在 80 年代,我了解到在 C 语言中,参数以相反的顺序在堆栈中传递,并由调用者解压,以允许具有可变数量参数的函数。这意味着,只要前 2 个参数正确,将第三个参数传递给需要 2 个参数的函数应该是无害的。
#include <stdio.h>
// declares a type for the …Run Code Online (Sandbox Code Playgroud)