3

は、私がCはオプションのnullパラメータをサポートしていますか? Pythonで

def send_command(command, modifier = None): 

のようなものに慣れているし、その後修飾子引数はオプションで、引数の不在が0の引数と区別することができるCで同様の機能がありますか?

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

ので、2番目の引数がされています。私はこのように、C、およびグーグルとの経験の浅いんだけど、あなたが同様にそれらを割り当てることができるようだC.でオプションのパラメータを使用する方法の明確な声明を見つけることができませんオプションで、使用しない場合はデフォルトで0になりますか? (編集:いいえ、これはとにかく無効Cである)

しかし、機能はsend_command(SOMETHING)send_command(SOMETHING, 0)区別することができますか?理想的には、2番目のパラメータは0

を含む任意のuint8値は、たぶん、NULLは0と異なっていることだろうか?

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

参照:私はトラブルそれを見つけるのを抱えている理由かもしれません[Cでのオーバーロード機能](http://stackoverflow.com/questions/479207/function-overloading-in-c) – Sjoerd

答えて

6

Cはオプションパラメータをサポートしていません。それはしばしば同様の効果に使用することができる関数のオーバーロードをサポートしません。

+0

。したがって、デフォルト値の0を割り当てる私の例はC++でのみ有効でしょうか? – endolith

+3

正しい。これはC++のデフォルト引数として知られています。 –

1

Cプログラミング言語にはオプションのパラメータはありません。 C++はありませんが、他の人が言っている

2

として「現代の多くのプログラミング言語の母は」Cは...、Cは、オプションのパラメータを持っていませんしません。

NULL0との差は、there isn't much of oneです。

9

オプションのパラメータは可変引数マクロとC99が可能である:今

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

FUNC(x)は、他の人がCは関数のデフォルト引数をサポートしていないと述べたようFUNC(x,y)

+7

私は泣くべきか笑うべきではない – pmg

+0

あなたは過負荷を見たくないのですか? ;-) –

+2

残念ながら、 'FUNC(x、y、z、t)'はエラーの代わりに 'func((x)、(y)、(z))'に展開されます。重要なことは、私が感じることは、過負荷を望んでいる人をちょっと*わずかに処罰することです。彼らが少なくともそれを期待するとき。 –

2

func((x), (y), (0))に展開、func((x), (0), (0))に展開します直接。しかし、マクロでこれを行う方法があります。 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++の場合、デフォルト引数の評価コンテキストは宣言のコンテキストです。評価コンテキストがマクロ呼び出しのコンテキストであるように指定することも可能です。

関連する問題