在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) {
答案 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没有可选参数。
至于NULL
和0
之间的差异,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不会...