【问题标题】:Macro issues in C++C++ 中的宏问题
【发布时间】: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 declarationerror 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++


【解决方案1】:

您需要反斜杠 (\) 来继续一行,而不是正斜杠 (/)。

【讨论】:

  • 这是有道理的,它现在确实有效。不过,我想不出这怎么能为别人编译。
  • 啊,我想我找到了问题所在。有一个编译脚本运行了一个 replace-all \ to / 我们的一个团队成员编写的,以使 windows 人员与 linux 人员相处得很好。删除它解决了这个问题。是时候在推送到我们的主分支之前教别人“测试”这个词的含义了:)
【解决方案2】:

这里没有提到的一件事:当遇到涉及宏的异常行为时,立即查看预处理器输出以查看编译器实际正在编译的代码。 (例如,使用“cc -E”。)这会使正斜杠问题变得明显。然后找到一个成功编译的系统并做同样的事情。这将显示斜线是不同的,从那里您可以找到更改源代码文本的内容。 (如果在 C++ 源文件的任何地方都将 all '/' 字符更改为 '\' 是一种常见的做法,我还建议另找工作或项目。)

【讨论】:

  • 感谢您的建议,我不知道这是可能的。我通常不处理宏,所以我对预处理器的体验是“它可以工作”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2011-01-02
  • 2015-05-29
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多