c++ 包含预处理器命令的多行宏

zxlwwiss  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(138)

我正试图用一行代码替换这三行相同的代码,以使我的代码更加紧凑和可读。
使用多行宏是我尝试的第一种方法。
所以,我想替换:

#ifndef OUTPUT_IN_BINARY
    *fileOutputStream << endl;
#endif

通过一个宏调用。
所以我加了一句

#define WRITE_ENDLINE   \
#ifndef OUTPUT_IN_BINARY   \
    *fileOutputStream << endl; \
#endif

在我的代码前面,我把我的行替换为:

WRITE_ENDLINE

但我犯了一系列错误:

>  error C2121: '#': invalid character: possibly the result of a macro expansion
>  error C2065: 'ifndef': undeclared identifier
>  error C2143: syntax error: missing ';' before 'constant'
>  error C2297: '*': illegal, right operand has type 'QDataStream *'
>  error C2065: 'endif': undeclared identifier

我在这里研究了一些其他的问题和各种文档,但是我没有得到这里有什么问题?也许是语法错误,因为我混合了其他宏命令?
我知道可能有其他的解决方案来实现我的目标,但我想尝试宏观的解决方案...
谢谢!

kfgdxczn

kfgdxczn1#

看看你的定义尝试

#define WRITE_ENDLINE   \
#ifndef OUTPUT_IN_BINARY   \
    *fileOutputStream << endl; \
#endif

我猜你想要的是以下内容:如果我使用WRITE_ENDLINE,那么在没有定义WRITE_ENDLINE的情况下,我希望它扩展为*fileOutputStream << endl;
你不需要指定你想要的东西,如果定义了WRITE_ENDLINE,你想要扩展的东西。
让我们假设您可以使用空行;我相信这是一个合理的假设,因为你没有提到任何替代代码。
为了达到这个目的,请使用这个定义:

#ifndef OUTPUT_IN_BINARY
#define WRITE_ENDLINE  *fileOutputStream << endl;
#else
#define WRITE_ENDLINE 
#endif

这样你就可以在你所想的情况下得到想要的代码,而在另一种情况下仍然是一个有效的,尽管是空的定义。这反过来又允许你使用宏,不管OUTPUT_IN_BINARY是否被定义。

相关问题