如果不为null,则为指针赋值

Assign value to pointer if not null

本文关键字:指针 赋值 null 如果不      更新时间:2023-10-16

我有一个整数指针作为默认函数参数。如果它不为空,我想分配一些值,可能是200行中的每10行。在每次作业前进行标准检查,我的代码很容易变得很大,更难阅读。(我指的是源文件的长度和可读性,而不是二进制大小。(

这是一个好的做法来取代这个:

// Previous statement
// Use to put empty line here
if(ptr)
    *ptr = val;
// Empty line also here
// Next statement

这个:

// Previous statement
assignIfNotNull(ptr, val);
// Next statement

并将if置于函数中?

inline void assignIfNotNull(int *ptr, int val)
{
    if(ptr)
        *ptr = val;
}

现在,我似乎一丝不苟,但这将节省3行每次使用。也许这不是我编程风格中最糟糕的东西,是我独自学习时即兴创作的。我想压制它,要求并保持标准。(我在任何地方都找不到这个。(

提前谢谢。

你可以去:

T dummy;
if ( !ptr ) 
    ptr = &dummy;

开始时;然后您可以在以后安全地编写CCD_ 1,而不需要进行null检查。

如果ptr的原始值很重要,您可以调用参数orig_ptr或其他什么。

C++的C#零合并运算符等价物几乎完全问你的问题,但不要指望找到一些突破性的解决方案-三元运算符、模板和宏只有一些变体:

ptr = (ptr != null ? ptr : MY_DEFAULT)
//------------------- or as function
template<class T>
GetValueOrDefault(T* value, T* defaultValue) // or put your own types
{
    return value != null ? value : defaultValue;
}
ptr = GetValueOrDefault(ptr, MY_DEFAULT);
//------------------- or as macro
#define GET_VALUE_OR_DEFAULT(value, defaultValue) (value != null ? value : defaultValue)
ptr = GET_VALUE_OR_DEFAULT(ptr, MY_DEFAULT);
//------------------- or like this macro
#define VALUE_OR_DEFAULT(value, defaultValue) value = (value != null ? value : defaultValue)
VALUE_OR_DEFAULT(ptr, MY_DEFAULT);

但你应该考虑以下几点:

  1. 不要想象没有问题的时候会有什么问题——对一些API来说,大量的检查和重新初始化是完全可行的——只需看看WINAPI
  2. 您确定应该覆盖此变量吗?也许是你可以重写您的函数或API以不重写它
  3. 您也可以考虑使用一些临时变量来代替ptr-它不会解决问题,只是把它颠倒过来,但是这可能会提高你的整体理解能力功能和删除检查:

      char* tempPtr = ptr;
      retCode = RandomlyNullifyThePtr(&tempPtr); // RandomlyNullifyThePtr can nullify the ptr it gets ,
      // but it won't nullify the ptr in calling function.
    
  4. 如果您在保持整个功能时遇到问题良心,那么这是应该重构的直接迹象-分成更小的部分,这样的支票可能会变成不必要:

      retCode = CompletePart1(ptr); // CompletePart1 can nullify the ptr it gets, 
      // but it won't nullify the ptr in calling function.
      ...
      retCode = CompletePart2(ptr);