C是否支持可选的null参数?

时间:2012-02-07 16:28:23

标签: c null optional-parameters function-declaration function-parameter

在Python中,我习惯了像

这样的东西
def send_command(command, modifier = None):

然后modifier参数是可选的,并且参数的缺失可以与参数0区分开来。在C中是否有类似的功能?我对C和Googling缺乏经验,但是找不到如何在C中使用可选参数的明确声明。看来你可以用类似的方式分配它们,如下所示:

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

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

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

也许NULL与0不同?

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

5 个答案:

答案 0 :(得分:9)

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))等。

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

至于NULL0之间的差异,there isn't much of one

答案 3 :(得分: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 ++相同,即默认参数的评估上下文是声明的上下文。还有可能以评估的上下文是宏调用的上下文的方式指定它。

答案 4 :(得分:1)

C编程语言没有可选参数。 C ++确实如此,但“许多现代编程语言的母亲”C不会...