8

Pythonでは、私は次のようなことに慣れています

def send_command(command, modifier = None):

次に、修飾子引数はオプションであり、引数がないことは引数 0 と区別できます。C に同様の機能はありますか? 私はCとグーグルの経験がありませんが、Cでオプションのパラメーターを使用する方法についての明確な説明を見つけることができません.次のように、同様にそれらを割り当てることができるようです:

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

2 番目の引数はオプションで、使用しない場合はデフォルトで 0 になりますか? (編集:いいえ、とにかくこれは無効なCです)

send_command(SOMETHING)しかし、関数はと を区別できsend_command(SOMETHING, 0)ますか? 理想的には、2 番目のパラメーターは、0 を含む任意の uint8 値にすることができます。

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 にはオプションのパラメーターがありません。

NULL0の違いについては、 1 つはあまりありません

于 2012-02-07T16:37:21.923 に答える
2

他の人が言ったように、C は関数のデフォルト引数を直接サポートしていません。しかし、マクロでこれを行う方法があります。P99には便利な「メタ」マクロがあり、この機能を比較的簡単に指定できます。pthread_mutex_init関数の 2 番目の引数を繰り返し指定しなければならないことを避けるための例として、次のようにします。

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 に答える