相关疑难解决方法(0)

C++或C中foo(void)和foo()之间有区别吗?

考虑这两个函数定义:

void foo() { }

void foo(void) { }
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?

c c++ arguments

243
推荐指数
3
解决办法
7万
查看次数

调用函数时使用比预期更多的参数是否合法?

语境:

我用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,因为:

  • 环境缓冲区对于 englobing 函数和内部函数来说都是已知的
  • longjmp当内部函数不知道已分配什么时,我应该及时释放所有分配的内存

第一个想法:

一个简单的解决方案是为比较函数提供第三个参数,以便它发出异常情况信号。但是,当在纯 C 环境中使用该库时,第三个参数就没有意义。然后我想起在 80 年代,我了解到在 C 语言中,参数以相反的顺序在堆栈中传递,并由调用者解压,以允许具有可变数量参数的函数。这意味着,只要前 2 个参数正确,将第三个参数传递给需要 2 个参数的函数应该是无害的。

演示代码:

#include <stdio.h>

// declares a type for the …
Run Code Online (Sandbox Code Playgroud)

c python language-lawyer

4
推荐指数
1
解决办法
715
查看次数

标签 统计

c ×2

arguments ×1

c++ ×1

language-lawyer ×1

python ×1