【发布时间】:2016-06-30 12:50:52
【问题描述】:
我想编写一个用于空安全指针访问的 C/C++ 宏。我目前有这个,效果很好:
#define NULL_SAFE(p, e) if (p) p->e
NULL_SAFE(myPtr, myMethod(myArg));
但我真正想要的是拥有这样的东西:
NULL_SAFE(
myPtr, myMethod(myArg),
myOtherPtr, myOtherMethod(myOtherArg),
yetAnotherMyPtr, plsStopMethod(grArg),
...
);
这将扩展为:
if (myPtr) myPtr->myMethod(myArg);
if (myOtherPtr) myOtherPtr->myOtherMethod(myOtherArg);
if (yetAnotherMyPtr) yetAnotherMyPtr->plsStopMethod(grArg);
我能想到一大堆我可能喜欢使用的这些,但它们都在与这个相同的概念上运作。
这可能吗?这是否已经存在于某个地方?有什么建议么?感谢您的帮助!
【问题讨论】:
-
您使用的是 C 还是 C++?如果使用 C++,您可能需要使用智能指针。
-
宏可能看起来很棒,但它们通常会使代码难以阅读和维护。所以我的建议是不要为此使用宏,而是使用显式代码。
-
比宏更好的是一个函数获取指针并在其上执行一些东西:
nullSafe(myPtr, [&](auto& pointee) { pointee.myMethod(myArg); });。不过,此时,您基本上拥有一个optional和一个map函数。 -
我真的不明白这么通用的东西会有什么用。通常,当您进行空值检查时,您必须以某种方式处理 空值条件。在什么情况下,您希望仅取消引用有效指针,而忽略无效指针?在这种情况下,使用 std::map 之类的容器不是更好吗?
-
如果指针为空,您是否真的通过静默跳过语句获得了一些东西?我更喜欢漂亮的崩溃,显示程序的错误。 (一个不同的故事是一个名为 IF_NOT_NULL 的宏)
标签: c++ c pointers null macros