3

在Python中,我已經習慣了的東西像C支持可選的空參數嗎?

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) { 
+0

請參閱:[函數重載在C](http://stackoverflow.com/questions/479207/function-overloading-in-c) – Sjoerd 2012-02-07 16:30:57

回答

6

C不支持可選參數。它也不支持可能經常用於類似效果的函數重載。

+0

這可能是爲什麼我無法找到它。所以我的例子分配默認值0只會在C++中有效? – endolith 2012-02-07 16:33:56

+3

正確。這在C++中被稱爲默認參數。 – 2012-02-07 16:36:48

1

C編程語言沒有可選參數。 C++沒有,但「許多現代編程語言的母親」C不......

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

+7

我不會哭或笑 – pmg 2012-02-07 16:57:36

+0

你不想看到超載,是嗎? ;-) – 2012-02-07 17:01:46

+2

不幸的是,'FUNC(x,y,z,t)'展開爲'func((x),(y),(z))'而不是錯誤。我覺得,重要的是僅僅懲罰那些想要超載的人。他們最不期待的時候。 – 2012-02-07 17:10:48

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++,那就是默認參數的評估上下文是聲明的上下文。還有可能以評估的上下文是宏調用的上下文的方式來指定它。