Visual Studio:C ++换行常量错误

six*_*nes 5 c++ qt visual-studio-2010

在Qt项目(带有Qt插件)上使用Visual Studio似乎总是抛出错误消息:

error C2001: newline in constant
Run Code Online (Sandbox Code Playgroud)

从以下行:

this->setApplicationVersion(QString(BUILD_VERSION));
Run Code Online (Sandbox Code Playgroud)

或每当我使用QMake文件中定义的编译器常量时。在我的QMake构建配方中定义了BUILD_VERSION,如果我使用其他的IDE(即使使用相同的MSVC编译器,则一切正常),编译项目即可成功进行。

我想我要么在Qt插件中或者在Visual Studio中缺少首选项,要么我需要在QMake文件之外重新定义常量常量等。

该常量由Intellisense定义并选择为:

#define BUILD_VERSION \"0.1.0\"
Run Code Online (Sandbox Code Playgroud)

发现问题在于转义常量中的引号,在Visual Studio中这是行不通的,但可以与Mingw和命令行上的MSVC编译器一起使用。在不进行转义的情况下定义常量可在Visual Studio中使用:

#define BUILD_VERSION "0.1.0"
Run Code Online (Sandbox Code Playgroud)

问题是在QMake文件中定义常量,我需要像这样转义:

#define BUILD_VERSION \\\"0.1.0\\\"
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在QMake文件中定义它们并使它们与Visual Studio一起使用?

Che*_*Alf 3

考虑写作

this->setApplicationVersion( QString( TO_STRING( BUILD_VERSION ) ) );
Run Code Online (Sandbox Code Playgroud)

其中TO_STRING将某物转换为字符串:

#include <iostream>
using namespace std;

#define TO_STRING_AUX( x )  #x
#define TO_STRING( x )      TO_STRING_AUX( x )

#define BUILD_VERSION 0.1.0

int main()
{
    cout << TO_STRING( BUILD_VERSION ) << endl;
}
Run Code Online (Sandbox Code Playgroud)

我没有 QMake,但我认为问题是 QMake 执行TO_STRING类似操作,然后自己执行,正如我首先指出的那样,这是一个通用解决方案。


编辑: @sixones 在后续评论中询问,

这是使用 TO_STRING 引发的警告;警告 C4003:宏“TO_STRING_AUX”的实际参数不足任何想法如何解决?

问题显然是作为参数传递的宏被定义为空(不是未定义,而是定义为空)。

解决方案是使用 C99/C++11可变参数宏定义,如下所示:

#define TO_STRING_AUX( ... )    "" #__VA_ARGS__
#define TO_STRING( x )          TO_STRING_AUX( x )
Run Code Online (Sandbox Code Playgroud)