C++ C+中的宏观问题+;

C++ C+中的宏观问题+;,c++,C++,我正在尝试实现一些为其他人工作的代码。我使用的是Visual Studio 2013,但我相信他们使用的是不同的编译器。除了一些宏之外,代码中的所有内容都正常工作 一个例子: #ifndef SAFE_DELETE #define SAFE_DELETE(x) / if (x != NULL) / { / delete x; / x = NULL; / } #endif 这里我得到了一个

我正在尝试实现一些为其他人工作的代码。我使用的是Visual Studio 2013,但我相信他们使用的是不同的编译器。除了一些宏之外,代码中的所有内容都正常工作

一个例子:

#ifndef SAFE_DELETE
#define SAFE_DELETE(x) /
    if (x != NULL)        /
    {                    /
    delete x;     /
    x = NULL;         /
}
#endif
这里我得到了一个错误
需要一个声明,或者
错误C2059:语法错误:“if'

毫不奇怪,我在尝试使用它时出现了一个错误:

SAFE_DELETE(*it); // "expected an expression"
我定义此宏的命名空间与我的应用程序的其余部分共享,该宏不在其他任何地方使用。也没有任何其他语法错误。注释掉include和
SAFE_DELETE(*它)生成将编译的代码。此外,用宏中的代码替换宏调用也可以

我尝试按如下方式重新定义函数:

#ifndef SAFE_DELETE
#define SAFE_DELETE(x) /
    x = NULL;         /
#endif
这会产生错误
错误:此声明没有存储类或类型说明符
。这让我相信,不知何故,这并没有在类中被调用,但它显然是


是什么导致了这个问题?另外,这怎么可能是为其他人编译的呢?

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

这里没有提到的一件事是:当遇到涉及宏的异常行为时,立即查看预处理器输出,以查看编译器实际编译的代码。(例如,使用“cc-e”。)这会使正斜杠问题变得明显。然后找到一个正在成功编译的系统,并执行同样的操作。这将显示斜杠是不同的,从那里你可以找到是什么改变了源代码文本。(如果在C++源文件中到处做诸如将所有‘/’字符‘改为’’这样的事情,我也建议找到另一个作业或项目。”始终使用
do..while
block在执行此类宏时…@请放心,一旦一切都正确移植,这些宏将被替换。不需要检查null。对于需要此功能的用户,将来的参考是,等效的无宏版本类似于
template void safeDelete(T*&x){delete x;x=NULL;}
。在C++11中,这将是
nullptr
,但实际上,手册
delete
一开始就有味道。不需要检查null,并且null的赋值无助于使删除更安全,它只会减少可以使用此宏的上下文(这是一件好事,因为它的零使用将是理想的)。使用集合和智能指针管理内存。请注意,null的赋值可以隐藏bug,这不是一件好事。这是有道理的,而且它现在确实在工作。不过,我想不出这是如何为其他人编译的。啊,我想我发现了这个问题。有一个编译脚本运行了一个replace all\to/我们的一个团队成员编写的,以使windows人员与linux人员友好相处。删除该选项修复了该问题。在推广到我们的主要分支之前,是时候去教别人“测试”这个词的意思了:)谢谢你的建议,我不知道这是可能的。我通常不处理宏,所以我对预处理器的经验是“它只是工作”。