【问题标题】:What would be a proper invalid value for a pointer?指针的正确无效值是什么?
【发布时间】:2012-05-07 21:12:13
【问题描述】:

假设我有这个代码。您的基本“如果调用者不提供值,则计算值”场景。

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,所以我不能使用 NULL 作为调用者不提供 ptr 的信号。

所以我不确定现在应该给 ptr 什么默认值而不是 NULL。我可以使用什么魔法值?有人有想法吗?

【问题讨论】:

  • 一个指针应该指向一个有效的对象或者为空——任何其他的都是自找麻烦。也许你想要Boost.Optional
  • 提供 NULL 和不提供 ptr 到底有什么区别?函数如何正常“处理”NULL,以及“未提供”ptr 时处理有何不同
  • 在我最初的概念中,fun();fun(NULL); 之间没有区别。因为我不打算使用 NULL。但现在我必须能够做到fun(NULL); 并正常处理它。那就是问题所在。编辑了我的问题。

标签: c++ default-arguments


【解决方案1】:
void fun()
{
   // calculate what ptr value should be
   const char* ptr = /*...*/;

   // now handle ptr normally
   fun(ptr);
}

【讨论】:

  • 我想这就是我所追求的,是的。不过,正如 irobot 稍后指出的那样,您可以将另一个函数命名为相同的名称。
【解决方案2】:

根据您的平台,指针可能是 32 位或 64 位值。

在这些情况下,请考虑使用:

0xFFFFFFFF or  0xFFFFFFFFFFFFFFFF

但我认为更大的问题是,“如何将 NULL 作为有效参数传递?”

我建议改为使用另一个参数:

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

或者也许:

void fun( /*enum*/ ptrState, const char* ptr = NULL)

【讨论】:

  • 好点。下次我可以记住这一点。不过,就我而言,我更喜欢 ronag 的回答。
【解决方案3】:

我同意所提供的所有其他答案,但这里还有另一种处理方法,对我个人来说,如果更详细的话,它看起来更明确:

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

void fun(const char* ptr)
{
  // Handle non-nullptr and nullptr separately
}

【讨论】:

  • 我更喜欢这样,它将预期的行为和检查从一个函数体分离到另一个函数体,并保持第二个定义更清晰,更不容易出错,使用空 arg 版本,您只需执行默认操作或返回跨度>
【解决方案4】:

您应该为此使用 nullptr。它在 C++11 标准中是新的。查看here 以获得一些解释。

【讨论】:

  • nullptr 应该使用而不是NULL,但这并不能解决他的问题。
  • 嗯,现在无法测试,没有足够现代的编译器。对不起。
【解决方案5】:

对不同的输入使用相同函数的重载版本是最好的,但如果你想使用单个函数,你可以将参数改为指针:

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

【讨论】:

    【解决方案6】:

    如果您想要一个对应于没有用的参数的特殊值,请创建一个。

    头文件:

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

    【讨论】:

      【解决方案7】:

      1?

      我无法想象有人会用那个地址为你分配内存。

      【讨论】:

      • 嗯,你知道,我其实一直在考虑这个,但没有。我的程序员的骄傲禁止它。就是感觉不对。
      猜你喜欢
      • 2016-09-25
      • 2010-09-18
      • 1970-01-01
      • 2022-01-11
      • 2023-01-28
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多