8

在 Python 中,我已经习惯了

def send_command(command, modifier = None):

然后修饰符参数是可选的,可以将参数的缺失与0的参数区分开来。C中是否有类似的功能?我对 C 和谷歌搜索缺乏经验,但找不到关于如何在 C 中使用可选参数的明确说明。似乎您可以类似地分配它们,如下所示:

void send_command(uint8_t command, uint8_t modifier = 0) {

所以第二个参数是可选的,如果不使用则默认为 0? (编辑:不,这无论如何都是无效的C)

但是函数可以区分send_command(SOMETHING)send_command(SOMETHING, 0)吗?理想情况下,第二个参数可以是任何 uint8 值,包括 0。

也许 NULL 与 0 不同?

void send_command(uint8_t command, uint8_t modifier = NULL) {
4

5 回答 5

19

C 不支持可选参数。它也不支持通常可以用于类似效果的函数重载。

于 2012-02-07T16:30:13.167 回答
13

可选参数在 C99 中可以使用可变参数宏:

#define JUST3(a, b, c, ...) (a), (b), (c)
#define FUNC(...) func(JUST3(__VA_ARGS__, 0, 0))

现在FUNC(x)扩展为func((x), (0), (0))FUNC(x,y)扩展为func((x), (y), (0)),等等。

于 2012-02-07T16:50:25.337 回答
3

正如其他人所说,C没有可选参数。

至于 和之间的区别NULL没有太多的0

于 2012-02-07T16:37:21.923 回答
2

正如其他人所说,C 不直接支持函数的默认参数。但是有一些方法可以用宏来做到这一点。P99有方便的“元”宏,使这个特性相对容易指定。例如,为了避免重复必须指定pthread_mutex_init函数的第二个参数:

P99_PROTOTYPE(int, pthread_mutex_init, pthread_mutex_t*, pthread_mutexattr_t const*);
#define pthread_mutex_init(...) P99_CALL_DEFARG(pthread_mutex_init, 2, __VA_ARGS__)
P99_DECLARE_DEFARG(pthread_mutex_init, , (pthread_mutexattr_t*)0);

然后直接使用

pthread_mutex_init(&my_mutex);

这里默认参数求值的语义与 C++ 相同,即默认参数的求值上下文是声明的上下文。也有可能以评估的上下文是宏调用的上下文的方式来指定它。

于 2012-02-07T18:21:56.113 回答
0

C 编程语言没有可选参数。C++ 有,但“许多现代编程语言之母”C 没有……

于 2012-02-07T16:32:17.000 回答