1

私がこのコードを持っているとしましょう。基本的な「発信者が値を提供しない場合は、値を計算する」シナリオ。

void fun(const char* ptr = NULL)
{
   if (ptr==NULL) {
      // calculate what ptr value should be
   }
   // now handle ptr normally
}

どちらかでこれを呼び出します

fun();          // don't know the value yet, let fun work it out

また

fun(something); // use this value

ただし、結局のところ、ptrはNULLを含むすべての種類の値を持つことができるため、呼び出し元がptrを提供しないことを示すシグナルとしてNULLを使用することはできません。

そのため、NULLの代わりにptrに与えるデフォルト値がわかりません。どのような魔法の価値を使用できますか?誰かアイデアがありますか?

4

7 に答える 7

4
void fun()
{
   // calculate what ptr value should be
   const char* ptr = /*...*/;

   // now handle ptr normally
   fun(ptr);
}
于 2012-05-07T21:15:01.270 に答える
2

プラットフォームに応じて、ポインタは32ビット値または64ビット値のいずれかである可能性があります。

そのような場合は、以下の使用を検討してください。

0xFFFFFFFF or  0xFFFFFFFFFFFFFFFF

しかし、もっと大きな問題は、「NULLを有効なパラメーターとして渡すにはどうすればよいか」ということだと思います。

代わりに、別のパラメーターを使用することをお勧めします。

void fun(bool isValidPtr, const char* ptr = NULL)

または多分:

void fun( /*enum*/ ptrState, const char* ptr = NULL)
于 2012-05-07T21:16:37.683 に答える
2

提供されている他のすべての回答に同意しますが、これを処理するもう1つの方法があります。これは、より冗長である場合、個人的にはより明確に見えます。

void fun()
{
  // Handle no pointer passed
}

void fun(const char* ptr)
{
  // Handle non-nullptr and nullptr separately
}
于 2012-05-07T21:29:23.553 に答える
1

異なる入力に同じ関数のオーバーロードされたバージョンを使用するのが最善ですが、単一の関数を使用する場合は、代わりにパラメーターをポインターからポインターにすることができます。

void fun(const char** ptr = NULL) 
{ 
   if (ptr==NULL) { 
      // calculate what ptr value should be 
   } 
   // now handle ptr normally 
} 

次に、次のように呼び出すことができます。

fun();

char *ptr = ...; // can be NULL
fun(&ptr);
于 2012-05-08T01:16:50.340 に答える
1

有用な引数に対応しない特別な値が必要な場合は、それを作成します。

ヘッダーファイル:

extern const char special_value;

void fun(const char* ptr=&special_value);

実装:

const char special_value;

void fun(const char* ptr)
{
    if (ptr == &special_value) ....
}
于 2012-05-08T02:42:51.487 に答える
1

そのためにはnullptrを使用する必要があります。C++11標準の新機能です。説明については、こちらをご覧ください。

于 2012-05-07T21:15:29.617 に答える
0

1?

誰かがあなたにそのアドレスであなたの記憶を割り当てているとは想像できません。

于 2012-05-07T21:14:40.300 に答える