我正在尝试实现一些适用于其他人的代码。我正在使用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
。这让我相信,某种程度上这不是在课堂上被调用,但很明显是。
可能导致此问题的原因是什么?另外,如何为其他人编译?
答案 0 :(得分:6)
你需要一个反斜杠(\
)来继续一行,而不是正斜杠(/
)。
答案 1 :(得分:1)
这里没有提到的一件事:当遇到涉及宏的异常行为时,请立即查看预处理器输出以查看编译器实际编译的代码。 (例如使用" cc -E"。)这会使正斜杠问题变得明显。然后找到一个成功编译的系统并执行相同的操作。这将显示斜杠是不同的,从那里你可以找到改变源代码文本的内容。 (如果通常的做法是在C ++源文件中将所有' /'字符更改为' \ c 39,我也会建议寻找另一份工作或项目。)