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一起使用?
考虑写作
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类似操作,然后自己执行,正如我首先指出的那样,这是一个通用解决方案。
这是使用 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)