【发布时间】:2015-03-17 23:53:39
【问题描述】:
我正在尝试实现一些对其他人有用的代码。我使用的是 Visual Studio 2013,但我相信他们使用的是不同的编译器。代码中的所有内容都可以正常工作,需要一些宏。
一个例子:
#ifndef SAFE_DELETE
#define SAFE_DELETE(x) /
if (x != NULL) /
{ /
delete x; /
x = NULL; /
}
#endif
这里我收到错误 expected a declaration 或 error C2059: syntax error : 'if'
毫不奇怪,我在尝试使用它时遇到错误:
SAFE_DELETE(*it); // "expected an expression"
我定义此宏的命名空间与我的应用程序的其余部分共享,并且该宏不会在其他任何地方使用。也没有任何其他语法错误。注释掉 include 和 SAFE_DELETE(*it); 会生成可以编译的代码。此外,用宏中的代码替换宏调用也可以。
我尝试重新定义函数如下:
#ifndef SAFE_DELETE
#define SAFE_DELETE(x) /
x = NULL; /
#endif
这会产生错误Error: this declaration has no storage class or type specifier。这让我相信,不知何故,这并没有在课堂上被调用,但它很明显是。
什么可能导致此问题?另外,这怎么可能是为别人编译的?
【问题讨论】:
-
那些宏将来会导致问题...在执行这些宏时始终使用
do..while块... -
@self 请放心,一旦一切都正确移植,这些宏将被替换。
-
不需要检查空值。对于想要这个的人的未来参考,一个等效的无宏版本看起来像
template<typename T> void safeDelete(T *&x) {delete x; x = NULL;}。在 C++11 中,这将是nullptr,但实际上,首先是手册delete。 -
不需要检查 null,并且 null 的分配无助于使删除更安全,它只会减少可以使用此宏的上下文(然而这是一件好事,因为零使用将是理想的)。使用集合和智能指针来管理内存。请注意,分配 null 可以隐藏错误,这不是一件好事。
标签: c++