C ++中的宏问题

时间:2015-03-17 23:53:40

标签: c++

我正在尝试实现一些适用于其他人的代码。我正在使用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。这让我相信,某种程度上这不是在课堂上被调用,但很明显是。

可能导致此问题的原因是什么?另外,如何为其他人编译?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

这里没有提到的一件事:当遇到涉及宏的异常行为时,请立即查看预处理器输出以查看编译器实际编译的代码。 (例如使用" cc -E"。)这会使正斜杠问题变得明显。然后找到一个成功编译的系统并执行相同的操作。这将显示斜杠是不同的,从那里你可以找到改变源代码文本的内容。 (如果通常的做法是在C ++源文件中将所有' /'字符更改为' \ c 39,我也会建议寻找另一份工作或项目。)